【问题标题】:Rotating vector with other vector as axis以其他向量为轴的旋转向量
【发布时间】:2014-04-12 01:45:34
【问题描述】:

我在一个项目中,我需要以 v2 作为旋转轴来旋转向量 v1,但我在向量和旋转方面遇到了一些问题。对此有很多解释,但我找不到解决我问题的解释。你能解释一下如何做到这一点,就好像我是一个五岁的孩子一样?

我试图做的是将一个四元数派生矩阵与我的“v1”相乘 这样做:

angle = (Convert.ToDouble(Console.ReadLine()) * Math.PI / 180);
cosA = Math.Cos(angle);
sinA = Math.Sin(angle);
oneMinusCosA = 1 - cosA;

matrix[0, 0] = gravityVector[0] * gravityVector[0] * oneMinusCosA + cosA;
matrix[0, 1] = gravityVector[0] * gravityVector[1] * oneMinusCosA + gravityVector[2] * sinA;
matrix[0, 2] = gravityVector[0] * gravityVector[2] * oneMinusCosA - gravityVector[1] * sinA;

matrix[1, 0] = gravityVector[1] * gravityVector[1] * oneMinusCosA - gravityVector[2] * sinA;
matrix[1, 1] = gravityVector[1] * gravityVector[1] * oneMinusCosA + cosA;
matrix[1, 2] = gravityVector[1] * gravityVector[2] * oneMinusCosA - gravityVector[0] * sinA;

matrix[1, 0] = gravityVector[2] * gravityVector[0] * oneMinusCosA - gravityVector[1] * sinA;
matrix[1, 1] = gravityVector[2] * gravityVector[1] * oneMinusCosA - gravityVector[0] * sinA;
matrix[1, 2] = gravityVector[2] * gravityVector[2] * oneMinusCosA + cosA;

result = new double[3];


for (int i = 0; i < 3; i++)
{
    result[i] = objectRotation[i] * matrix[i, 0] + objectRotation[i] * matrix[i, 1] + objectRotation[i] * matrix[i, 2];
    Console.WriteLine(result[i]);
}

但我得到了错误的结果。有人可以帮助我了解原因或帮助我找到其他解决方案吗?

例子:

v1(1,0,0) v2(0,1,0) angle=90 -> vf(0,0,-1)

v1(sqrt2/2 , sqrt2/2 , 0) v2(-sqrt2/2 , sqrt2/2 , 0) angle = 90 -> vf(0,0,-1)

*OBS:我需要将它应用于每个向量和每个角度,不仅适用于 90 度(或 pi/2 弧度,没关系),也适用于我用作示例的那些向量。

*OBS(2):如果您能以 C#(首选)或 C++ 发布代码,我会很高兴。

【问题讨论】:

  • 如果您使用适当的数学库,应该有一个函数可以从轴和角度创建矩阵。只需将此矩阵与向量相乘。如果没有,Wikipedia 有公式。
  • 我怕5岁的孩子无法解释所需的数学。尽管它是特别漂亮的数学,但它远非微不足道。如果您准备好尝试解决它,请查看这篇维基百科文章:en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
  • 这个问题似乎离题了,因为它无法以提出的方式回答。
  • 我尝试使用维基百科和其他网站建议的一些矩阵,但似乎没有一个可以工作。我一定是做错了什么,但我不知道是什么。
  • @cmaster btw,当我要求像 5 岁的孩子一样被解释时,我的意思不是简单地发布答案而不解释任何内容。对不起,我的错。

标签: c# c++ vector rotation quaternions


【解决方案1】:

回答我自己的问题,您可以通过应用以下公式进行轮换:

vf = v1 * cosA + (v1 . v2) * v2 * (1 - cosA) + (v2 x v1) * sinA

这里是如何得到公式:

basic

f perpendicular to a, v1 and v2

*其中 p 是 v1 到 v2 的投影

p = (v1 . v2) * v2
a = v1 - p = v1 -(v1 . v2) * v2
f = (v2 x v1)/|(v2 x v1)| * |a|
a'= a * cos(θ) + f * sin(θ)
vf = a'+ p

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2018-06-24
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多