如何旋转始终与圆形路径相切的对象?

问题描述

我最近开始学习计算机图形学,我需要一些帮助。

我正在尝试复制“棒”围绕圆形路径的旋转方式,使棒始终与路径相切。我提供了一张图片来帮助说明所需的行为:

Intended rotation

我尝试了一些方法,但从未成功。在我最近一次测试的gif下方,其中小立方体代表棍子应绕其旋转但与该路径相切的圆形路径。

Rotation achieved

我应用于对象世界矩阵的转换:

XMMATRIX mScale = XMMatrixScaling(0.3f,0.3f,0.3f);
XMMATRIX mOrbit = XMMatrixRotationY(-t * 2.0f);
XMMATRIX mdistance = XMMatrixTranslation(2.0f,0.0f,0.0f);
g_World1 = mScale * mdistance * mOrbit;

XMMATRIX mScale2 = XMMatrixScaling(4.0f,0.3f);
XMMATRIX mOrbit2 = mOrbit;
XMMATRIX mdistance2 = XMMatrixTranslation(2.0f,0.0f);
XMMATRIX mPosition2 = XMMatrixTranslation(2.0f,0.0f);
g_World2 = mScale2 * mdistance2 * mOrbit2 * mPosition2;

您能通过一些指导/提示来帮助我解决这个问题吗?

更新:

重现此步骤:

a)下载项目Direct3D11Tutorials
b)打开教程5
c)找到两个多维数据集的“世界矩阵”,并用本文中提到的矩阵替换它们。

谢谢!

解决方法

我可以通过平移操纵杆的Z坐标而不是X来重现我想要的行为:

//small cube as reference
XMMATRIX mScale = XMMatrixScaling(0.1f,0.1f,0.1f);    
g_World1 = mScale;

//stick rotating around the small cube
XMMATRIX mScale2 = XMMatrixScaling(3.0f,0.3f,0.3f);
XMMATRIX mOrbit2 = XMMatrixRotationY(-t * 2.0f);
XMMATRIX mDistance2 = XMMatrixTranslation(0.0f,0.0f,3.0f);
g_World2 = mScale2 * mDistance2 * mOrbit2;

结果:

Result

如果有人有另一种更好的方法,请让我知道。