Libgdx 查找一个矢量3相对于另一个矢量的轴/角度
这似乎是一项简单且有充分记录的任务。 我有两个代表模型位置的Vector3对象 我希望指向一个位于一个Vector3位置的对象,这样它就会看到另一个Vector3位置 最初我看了一些资料来源,如; 它似乎记录了这个方法,即求角的点积和轴的叉积 查看四元数源代码,似乎“setFromCross”为我做到了这一点。 所以我尝试了以下代码Libgdx 查找一个矢量3相对于另一个矢量的轴/角度,libgdx,Libgdx,这似乎是一项简单且有充分记录的任务。 我有两个代表模型位置的Vector3对象 我希望指向一个位于一个Vector3位置的对象,这样它就会看到另一个Vector3位置 最初我看了一些资料来源,如; 它似乎记录了这个方法,即求角的点积和轴的叉积 查看四元数源代码,似乎“setFromCross”为我做到了这一点。 所以我尝试了以下代码 Vector3 thisPoint=this.transState.position.cpy(); Vector3 targetPoint=target.tran
Vector3 thisPoint=this.transState.position.cpy();
Vector3 targetPoint=target.transState.position.cpy();
targetPoint.nor();
这一点;
四元数结果=新四元数();
结果。setFromCross(目标点,此点);
这看起来很简单,但不起作用——显然指出了错误的方向。
然后我尝试手动实现它
float theirDotProduct=thisPoint.dot(targetPoint);
浮动角度=(float)Math.acos(它们的点积);
Vector3-theirCrossProduct=此点.crs(目标点);
向量3轴=它们的交叉积.nor();
//现在从它生成一个四元数并返回
四元数结果=新四元数();
结果。从AxisRad(轴、角度)设置;
同样也不起作用,再次,指向明显错误的方向(不是90度或任何固定的角度,方向和向量之间的关系似乎是错误的)
作为参考,我使用的是一个系统,其中我的模型将其位置和旋转存储为矢量3和四元数-为了动画起见,我只在最后一步转换为矩阵。 用于获取该四元数并设置模型旋转的精确代码为
/**查看目标模型矢量3位置(当前不工作)**/
public void lookAt(AnimatableModelInstance目标){
四元数角度=getAngleTo(目标);
设置旋转(角度);
}
/***设置旋转。如果进行更复杂的更改,请创建PosRotScale并调用setTransform**/
公共无效设置旋转(四元数角度){
转换状态。旋转。设置(角度);
syntransform();
}
公共无效SyncTransform(){
super.transform.set(transState.position、transState.rotation、transState.scale);
}
这似乎适用于我正在做的所有其他旋转动画,因此我认为错误不在该区域
我猜这是我在这里遗漏的一些基本步骤或概念
谢谢,
-托马斯我不熟悉libgdx。我觉得我的回答没有帮助,或者完全错了,也许我可以抓住这个徽章
关于计算的角度,似乎存在误解。您说您正在存储对象的位置。然后,计算点积
float theirDotProduct = thisPoint.dot(targetPoint);
但是,从该点积计算的角度与将一个对象与另一个对象的方向对齐所需的角度无关。这里计算的角度基本上是从原点开始并通过对象位置的线之间的角度(也如链接到的站点上的图像所示)
例如,我假设对象有一个默认方向,其中旋转角度为零,并且对象“指向x轴”。然后,为了对齐此类对象,使其“指向另一个对象的方向”,必须按如下方式设置此对象的方向: 你必须计算对象之间的差异——就像在对象之间画一条线。然后,可以计算这条线和x轴之间的角度 这是旋转对象A以使其指向对象B所需的角度 旋转轴通过取叉积计算,但再次不是在对象位置之间,而是在x轴和对象位置差之间
因此,涉及到对libgdx使用的一些猜测的代码大致如下所示:
Vector3 thisPoint = ...;
Vector3 targetPoint = ...;
Vector3 difference = targetPoint.sub(thisPoint);
if (difference.len() < someSmallEpsilon)
{
// Objects are at the same location - can't
// sensibly compute a direction to look at
return;
}
Vector3 direction = difference.nor()
Vector3 xAxis = new Vector3(1,0,0);
float dotProduct = xAxis.dot(direction);
float angle = (float) Math.acos(dotProduct);
if (angle < someSmallEpsilon)
{
// Angle is already right. Nothing to do
return;
}
Vector3 axis = xAxis.crs(direction).nor();
Quaternion result = new Quaternion();
result.setFromAxisRad(axis, angle);
向量3这个点=。。。;
向量3目标点=。。。;
Vector3差异=targetPoint.sub(该点);
if(difference.len()(不要把我牵制在符号上——可能角度(或轴)必须是否定的——但这应该是基本方法)两个位置之间没有轴/角度。计算两个向量的旋转只有在它们具有相同位置(原点)时才有用 请记住,向量并不代表一个位置,而是如何从原点到一个特定的位置(虽然在你的例子中这实际上可能是相同的,但在数学上是非常不同的)。您可能已经尝试过使用它,因为您正在规范化向量(在代码中实际上删除了一些重要信息) 计算位置之间的角度将获得这些位置之间相对于原点(位置0,0,0)的旋转。换句话说:它将使您获得旋转
此点
矢量应围绕0,0,0旋转,以匹配目标点
的方向(而不是长度)。注意方向和长度的用法,这是表达相同内容的另一种方式。例如,x:5,y:0,z:0的向量的方向为x:1,y:0,z:0,长度为5
在本例中,您需要targetPoint
Vector3 direction = new Vector3();
direction.set(targetPoint).sub(thisPoint).nor();
result.setFromCross(Vector3.X,t direction);