旋转矢量与其他矢量作为轴

时间:2014-04-12 01:45:35

标签: c# c++ vector rotation quaternions

我正处于一个项目中,我需要旋转矢量v1,v2作为旋转轴,但我在向量和旋转时遇到了一些问题。有很多解释,但我找不到解决我的问题的解释。你能解释一下如何这样做,好像我是一个五岁的孩子吗?

我尝试做的是将四元数派生矩阵与我的“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 ++发布代码,我会很高兴。

1 个答案:

答案 0 :(得分:0)

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

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