gpt4 book ai didi

c++ - 旋转播放器模型以指向一个点

转载 作者:行者123 更新时间:2023-12-02 10:15:50 25 4
gpt4 key购买 nike

我看过三年前的帖子,问过一个类似的问题,即如何使用glm::lookAt实现此功能,但不能完全将其应用于我的游戏。

我有一个在曲线上移动的相机和播放器模型。这是通过计算曲线上的点并使用glm::translate (identityMatrix, positionCameraIsCurrentlyAt)简单地将玩家移动到那里来完成的,因此,我在曲线上有当前位置,还有nextPosition
我现在想使用转换矩阵旋转模型,但似乎无法完成。我的第一个想法是计算一个 vector currentPosition - nextPosition以获得我应该面对的 vector ,我称之为targetPoint。并通过简单地将启动时将其设置为(0,0,1)来计算我当前面临的 vector (当您朝负z方向移动时,我想这就是模型的定向方式),并在旋转后将其更新为targetPoint vector 。
vector 的Bot归一化。

代码如下所示:

glm::vec3 targetPoint = glm::normalize(position - curveIter->calcCurvePosition(curveProgress));
glm::mat4 rotationMatrix = glm::rotate(modelMatrix, glm::radians(glm::angle(pointingTowards, targetPoint)), glm::vec3(0.0, 1.0, 0.0));
glm::mat4 translationMatrix = glm::translate(modelMatrix, position);

// Test print vectors and angle
std::cout << targetPoint.x << ", " << targetPoint.y << ", " << targetPoint.z << ", " << "pointing towards: " << pointingTowards.x << ", " <<pointingTowards.y << ", " << pointingTowards.z << ", " << glm::angle(glm::normalize(pointingTowards), forward) << std::endl;
pointingTowards = targetPoint;

// Test print vectors and angle
std::cout << targetPoint.x << ", " << targetPoint.y << ", " << targetPoint.z << ", " << "pointing towards: " << pointingTowards.x << ", " << pointingTowards.y << ", " << pointingTowards.z << ", " << glm::angle(glm::normalize(pointingTowards), forward) << std::endl;

return translationMatrix*rotationMatrix;

这实际上并没有旋转模型。我打印了 vector 和 Angular 以检查它们和结果,其中:
targetPoint:(-0.97509,0,0.22181)
pointingTowards:(-0.97509,0,0.22181)
angle:3.14159

因此,似乎它们都太小了。我想这可能是归一化的结果。但是,该方法说两个 vector 都需要归一化。 angle始终为Pi,这看起来可能很奇怪,但由于曲线为圆。显然,对于第一个 angle为2.35469而言,这是不正确的,因为 vector 分别是 targetPoint(-0.708167,0,0.706045)和 pointingTowards:(0,0,1)。

有什么想法我在这里做错了吗?
非常感谢你!

最佳答案

假设您有一个positiontargetPoint。您可以定义upVec并通过Cross product计算旋转矩阵的轴,如下所示:

glm::vec3 upVec(0, 1, 0);

glm::vec3 z_axis = glm::normalize(targetPoint - position);
glm::vec3 x_axis = glm::normalize(glm::cross(upVec, z_axis));
glm::vec3 y_axis = glm::normalize(glm::cross(z_axis, x_axis));

glm::mat4 rotationMatrix(
glm::vec4(x_axis, 0),
glm::vec4(y_axis, 0),
glm::vec4(z_axis, 0),
glm::vec4(0, 0, 0, 1));

另一种可能性是使用 Quaternion

#include <glm/gtx/quaternion.hpp>

定义从(0,0,1)到 tragetVec的旋转并将四元数转换为旋转矩阵:

glm::vec3 tragetVec = glm::normalize(targetPoint - position);
glm::quat rotQuat = glm::rotation(glm::vec3(0, 0, 1), tragetVec);
rotationMatrix = glm::toMat4(rotQuat);

关于c++ - 旋转播放器模型以指向一个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61984642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com