首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方向角或将3D角度指向空间中的某个位置

方向角或将3D角度指向空间中的某个位置
EN

Stack Overflow用户
提问于 2010-10-16 22:45:57
回答 1查看 1.1K关注 0票数 2

我正在尝试将实体指向3D矢量。(基本上是设置实体角度,使其指向3D空间中的某个位置)。目前,我只能从向量中获取一个角度。

代码语言:javascript
复制
//Vectors in the bracket are 3D, first is the entity position, second is a position in space where I want to point at.
( myEntity.Pos - posToPointAt ).Angle

我目前被困在将方向向量转换为角度的工作中。非常感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-17 03:24:14

这不是它的工作方式,你丢失了一个基本的信息:你需要找出你的实体现在指向什么方向,而不是使用实体位置?获取这些信息可能和使用当前旋转矩阵并将其乘以z轴下的单位向量(或实体的“中性”方向)一样简单,但这完全取决于您的特定设置。

一旦你有了两个方向向量(你的当前方向和指向新的所需位置的方向...最后一个是标准化的"myEntity.Pos - posToPointAt"),您可以使用如下所示的函数来计算方向之间的旋转。请注意,这里使用的是四元数,您可能需要一个旋转矩阵。

代码语言:javascript
复制
function RotationBetweenVectors( const aV1, aV2: TVector3): TQuaternion;
const
  EPSILON = 0.000001;

var
  v1: TVector3;
  v2: TVector3;
  dot: FloatT;
  s: FloatT;
  invS: FloatT;
  c: TVector3;

begin
  v1 := aV1.normalize;
  v2 := aV2.normalize;

  dot := VectorDotProduct( v1, v2 );

  if dot >= 1 then
  begin
      // INFO: DotProduct = 1 -> vectors are the same
      result := QUATERNION_IDENTITY
  end
  else if ( dot < EPSILON - 1 ) then
  begin
      raise Exception.create( '180 degree rotation currently not supported.' );
  end
  else
  begin
      s := sqrt( 2 * ( 1 + dot ));
      invS := 1 / s;

      c := VectorCrossProduct( v1, v2 );

      result.x := c.x * invS;
      result.y := c.y * invS;
      result.z := c.z * invS;
      result.w := 0.5 * s;
      result := result.normalize;
  end;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3949346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档