AABB
AlignmentBehavior
ArriveBehavior
AStar
BFS
BoundingSphere
BVH
BVHNode
Cell
CellSpacePartitioning
CohesionBehavior
CompositeGoal
ConvexHull
Corridor
CostTable
DFS
Dijkstra
Edge
EntityManager
EvadeBehavior
EventDispatcher
Behavior
FollowPathBehavior
FuzzyAND
FuzzyCompositeTerm
FuzzyFAIRLY
FuzzyModule
FuzzyOR
FuzzyRule
FuzzySet
FuzzyTerm
FuzzyVariable
FuzzyVERY
GameEntity
Goal
GoalEvaluator
Graph
GraphUtils
HalfEdge
HeuristicPolicyDijkstra
HeuristicPolicyEuclid
HeuristicPolicyEuclidSquared
HeuristicPolicyManhattan
InterposeBehavior
LeftSCurveFuzzySet
LeftShoulderFuzzySet
LineSegment
Logger
MathUtils
Matrix3
Matrix4
MemoryRecord
MemorySystem
MeshGeometry
MessageDispatcher
MovingEntity
NavEdge
NavMesh
NavMeshLoader
NavNode
Node
NormalDistFuzzySet
OBB
ObstacleAvoidanceBehavior
OffsetPursuitBehavior
OnPathBehavior
Path
Plane
Polygon
Polyhedron
PriorityQueue
PursuitBehavior
Quaternion
Ray
RectangleTriggerRegion
Regular
RightSCurveFuzzySet
RightShoulderFuzzySet
SAT
SeekBehavior
SeparationBehavior
SingletonFuzzySet
Smoother
SphericalTriggerRegion
State
StateMachine
SteeringBehavior
SteeringManager
Task
TaskQueue
Telegram
Think
Time
TriangularFuzzySet
Trigger
TriggerRegion
Vector3
Vehicle
Version
WanderBehavior

getNormalFromSurfacePoint

介绍

Yuka js库中AABB(轴对齐包围盒)对象的方法getNormalFromSurfacePoint(),用于获取指定表面点的法向量。

参数

  • point:表面点的坐标(类型为Vector3)。

返回值

  • 返回值为Vector3类型,表示表面点的法向量。

使用示例

const box = new YUKA.AABB(new YUKA.Vector3(), new YUKA.Vector3(1, 1, 1));

const point = new YUKA.Vector3(0, 1, 0.5);
const normal = box.getNormalFromSurfacePoint(point);

console.log(normal); // 输出结果为:Vector3 { x: 0, y: 1, z: 0 }

实现原理

该方法的实现原理比较简单,即通过比较表面点和包围盒六个面的位置关系,来确定表面点所在面的法向量。

具体实现步骤如下:

  1. 首先判断表面点是否在包围盒内部,如果是,则直接返回三个坐标轴的任意一条向量。
  2. 判断表面点是否在包围盒的正面平面、负面平面、左面平面、右面平面、上面平面、下面平面上。
  3. 根据在哪个平面上,来分别计算出不同的法向量。

示例说明

在使用示例中,我们创建了一个以原点为中心、边长为1的立方体包围盒,并将一个坐标为(0, 1, 0.5)的点作为表面点传入getNormalFromSurfacePoint()方法中,最终得到该点所在面的法向量为Vector3 { x: 0, y: 1, z: 0 }。

注意事项

  • 由于该方法只是用于平面的法向量计算,在一些特殊的情况下,得到的结果可能不是我们想要的。因此,在使用该方法时要考虑周全,避免出现意外情况。