以其他矢量为轴旋转矢量
Rotating vector with other vector as axis
我在一个项目中需要用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度(或π/2弧度,无关紧要),也适用于我用作示例的那些向量。
*OBS(2):如果你能用C#(首选)或C++发布代码,我会很高兴。
回答我自己的问题,您可以通过应用以下公式进行旋转:
vf = v1 * cosA + (v1 . v2) * v2 * (1 - cosA) + (v2 x v1) * sinA
下面是如何得出公式:
基本
f垂直于a,v1和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
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 与互斥锁相比,旋转锁可以保证上下文切换
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- 绘制旋转的三角形
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- GlobalAlloc而不是其他分配方法
- 旋转模型矩阵时的形状失真
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 四边形的 2D 旋转
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 如何在 opengl 中仅旋转特定对象而不影响其他对象?
- 无法从非原点的其他位置旋转对象
- 我的方形四边目一直在奇怪地旋转,但我的其他四边目旋转得很好
- 以其他矢量为轴旋转矢量
- 如何在其他部件旋转时阻止对象旋转