我目前所拥有的是导致我的3D对象变得扁平。但它正盯着我的目标。
Vector4 up;
newMatrix.SetIdentity();
up.set_x(0);
up.set_y(1);
up.set_z(0);
Vector4 zaxis = player_->transform().GetTranslation() - spider_->transform().GetTranslation();
zaxis.Normalise();
Vector4 xaxis = CrossProduct(up, zaxis);
xaxis.Normalise();
Vector4 yaxis = CrossProduct(zaxis, xaxis);
newMatrix.set_m(0, 0, xaxis.x()); newMatrix.set_m(0, 1, xaxis.y()); newMatrix.set_m(0, 2, xaxis.z());
newMatrix.set_m(1, 0, yaxis.x()); newMatrix.set_m(1, 1, yaxis.y()); newMatrix.set_m(1, 2, yaxis.z());
newMatrix.set_m(2, 0, zaxis.x()); newMatrix.set_m(2, 1, zaxis.y()); newMatrix.set_m(2, 2, zaxis.z());请原谅将值放入矩阵的方法,我正在使用框架提供的内容。
Vector4 Game::CrossProduct(Vector4 v1, Vector4 v2)
{
Vector4 crossProduct;
crossProduct.set_x((v1.y() * v2.z()) - (v2.y() * v2.z()));
crossProduct.set_y((v1.z() * v2.x()) - (v1.z() * v2.x()));
crossProduct.set_z((v1.x() * v2.y()) - (v1.x() * v2.y()));
return crossProduct;
}我在这里做错了什么?请注意,我已经在前面添加了第四行,并在前面的角落中添加了1以防万一,没有任何更改。
发布于 2018-11-25 21:15:42
当(0,1,0)接近于你想要观察的方向时,你就会遇到问题。那么叉积将失败,导致一个或两个基向量为零,这可能导致2D外观。但是,只有当对象之间仅在y轴上偏移时,才会发生这种情况。为了避免这种情况,您可以在up和view方向之间测试dot产品,如果结果的abs大于0.7,则使用(1,0,0) (作为up或right或其他...)。
另外,由于我们对你的符号一无所知,我们不能确认你的矩阵设置是正确的(它可能是也可能不是,它可能被转置等)。有关更多信息,请查看:
但最有可能的是,您的矩阵也包含透视变换,通过设置它的单元格,您完全覆盖了它,从而导致没有透视,因此是2D输出。在这种情况下,您应该将原始透视矩阵与新矩阵相乘,并使用结果。
https://stackoverflow.com/questions/53467291
复制相似问题