gpt4 book ai didi

libgdx - 找到一个 Vector3 相对于另一个的轴/角度

转载 作者:行者123 更新时间:2023-12-01 22:30:45 26 4
gpt4 key购买 nike

这似乎是一项简单且有据可查的任务。我有两个代表模型位置的 Vector3 对象。

我希望指向位于一个 Vector3 位置的对象,以便它查看另一个 Vector3 位置。

最初我查看了一些资源,例如; http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/

这似乎记录了寻找角度的点积和轴的叉积的方法。

查看四元数源代码似乎“setFromCross”为我做了这个。所以我尝试了以下代码;

Vector3 thisPoint = this.transState.position.cpy();
Vector3 targetPoint = target.transState.position.cpy();

targetPoint.nor();
thisPoint.nor();

Quaternion result = new Quaternion();
result.setFromCross(targetPoint,thisPoint);

这看起来很简单但没有用 - 显然指向了错误的方向。然后我尝试手动实现它;

float theirDotProduct = thisPoint.dot(targetPoint); 
float angle = (float) Math.acos(theirDotProduct);

Vector3 theirCrossProduct = thisPoint.crs(targetPoint);
Vector3 axis = theirCrossProduct.nor();

//now make a Quaternion from it and return
Quaternion result = new Quaternion();
result.setFromAxisRad(axis, angle);

同样没有用,再次明确指向错误的方向(并且不是偏离 90 度或固定量的任何东西,方向和矢量之间的关系似乎是错误的)


作为引用,我正在使用一个系统,我的模型将它们的位置和旋转存储为 vector3s 和 Quaterions - 为了动画,我只在最后一步转换为矩阵。用于获取该 Quaterion 和设置模型旋转的确切代码是;

/** lookat the target models vector3 location (currently doesn't work) **/
public void lookAt(AnimatableModelInstance target){

Quaternion angle = getAngleTo(target);
setToRotation(angle);

}

/*** Set the rotation. If doing a more complex change make a PosRotScale and call setTransform **/
public void setToRotation(Quaternion angle) {
transState.rotation.set(angle);
sycnTransform();
}

public void sycnTransform() {
super.transform.set(transState.position, transState.rotation, transState.scale);
}

这似乎适用于我正在做的所有其他旋转动画,所以我认为错误不在那个区域。

我猜这是我在这里缺少的一些基本步骤或概念。

谢谢,-托马斯

最佳答案

两个位置之间没有轴/角度这样的东西。计算两个向量的旋转只有在它们具有相同的位置(原点)时才有用。

请记住,矢量不代表位置,而是代表如何从原点到达特定位置(尽管在您的情况下这实际上可能是同一件事,但在数学上却大不相同)。您可能已经尝试使用它,因为您正在规范化向量(这在您的代码中实际上删除了相当多的重要信息)。

计算位置之间的角度将使您获得这些位置之间相对于原点(位置 0,0,0)的旋转。换句话说:它会让你旋转 thisPoint 向量应该旋转大约 0,0,0 以匹配方向(不是 <targetPoint 的 em>length)。注意方向长度的使用,这是表达同一事物的另一种方式。例如。向量 x:5,y:0,z:0 的方向为 x:1,y:0,z:0,长度为 5。

在您的情况下,您需要 targetPoint 相对于 的矢量(尤其是方向,但不需要长度)这个点。或者换句话说:如果您从 thisPoint 开始,您应该朝哪个方向到达 targetPoint。这可以通过减去向量然后对结果进行归一化来轻松计算。需要规范化以删除长度(将其设置为 1),因此我们只保留方向

Vector3 direction = new Vector3();
direction.set(targetPoint).sub(thisPoint).nor();

现在我们有了您希望模型观察的方向。要计算旋转,我们首先需要知道它在未旋转时注视的位置。这显然取决于您的模型及其建模方式。假设它的基本向量(未旋转的方向)是 Vector3.X,那么您可以使用:

result.setFromCross(Vector3.X,t direction);

关于libgdx - 找到一个 Vector3 相对于另一个的轴/角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29686149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com