Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 正确定向三维网格以指向其方向';s航向_Opengl_3d_Rotation - Fatal编程技术网

Opengl 正确定向三维网格以指向其方向';s航向

Opengl 正确定向三维网格以指向其方向';s航向,opengl,3d,rotation,Opengl,3d,Rotation,我试着让一个网格穿过一个球体的电路。我拍摄了环绕球体的图像,并为我希望网格遵循的路径上色。然后我计算了路径的所有(u,v)点。使用(u,v)点,我转换为球坐标以将网格放到球体上,并设置围绕X轴和Y轴的旋转rot.X和rot.Y,以便网格与球体相切并面向球体的北极。我的问题是让网格朝向它的方向。第三个旋转变量rot.z,用于设置网格的标题。目前,我得到了第5到第14个点的(u,v)点,并取当前点和未来10个点的线段的平均仰角。这是可行的,但有两个缺点是航向振动非常频繁,而且航向在稍微急剧转向时有不

我试着让一个网格穿过一个球体的电路。我拍摄了环绕球体的图像,并为我希望网格遵循的路径上色。然后我计算了路径的所有(u,v)点。使用(u,v)点,我转换为球坐标以将网格放到球体上,并设置围绕X轴和Y轴的旋转
rot.X
rot.Y
,以便网格与球体相切并面向球体的北极。我的问题是让网格朝向它的方向。第三个旋转变量
rot.z
,用于设置网格的标题。目前,我得到了第5到第14个点的(u,v)点,并取当前点和未来10个点的线段的平均仰角。这是可行的,但有两个缺点是航向振动非常频繁,而且航向在稍微急剧转向时有不准确的趋势。计算网格标题的好方法是什么?

一种简单的方法是建立旋转矩阵。这样你就不必考虑角度,因为如果你知道方向和上或右向量,所有的条目都可以计算出来。在您的例子中,方向是球体上的切线,上方向向量是该点的法线

vec3 direction = tangent;
vec3 up = normal;
vec3 right = cross(direction,up);

mat3 m;
m[0] = right;
m[1] = up;
m[2] = direction;

这就是问题所在:在你的方法中计算方向向量,或者在我的方法中设置旋转角度。因为我要处理的是一个球体,所以我要看的是一个切平面,而不是一条直线。网格是定向的,因此我使用
rot.x
rot.y
来确保网格位于切面上(这样我可以计算
向上
向量),但我正试图根据网格将要到达的点获得适当的方向。那么问题是什么?切线平面中有无限个可能的向量。找一个应该不难。基本上,我有一个大约5000(u,v)个点的列表,这些点组成了旅行的路径。给定路径的索引
i
,我查看点
i+5
i+14
和和
arctan2(v2-v1,u2-u1)
。这是可行的,但它会导致网格的角度在很大程度上跳跃,我正试图找到一种方法使角度变化更平滑。你想在球体上从
p1
移动到
p2
?方向向量可以很容易地用2个叉积来计算<代码>d=p2-p1;向上=正常化(p1中间);右=交叉(d,向上);方向=交叉(向上,右侧)