首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让3D对象看3D对象矩阵?

让3D对象看3D对象矩阵?
EN

Stack Overflow用户
提问于 2018-11-25 20:10:04
回答 1查看 43关注 0票数 0

我目前所拥有的是导致我的3D对象变得扁平。但它正盯着我的目标。

代码语言:javascript
复制
    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());

请原谅将值放入矩阵的方法,我正在使用框架提供的内容。

代码语言:javascript
复制
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以防万一,没有任何更改。

EN

回答 1

Stack Overflow用户

发布于 2018-11-25 21:15:42

(0,1,0)接近于你想要观察的方向时,你就会遇到问题。那么叉积将失败,导致一个或两个基向量为零,这可能导致2D外观。但是,只有当对象之间仅在y轴上偏移时,才会发生这种情况。为了避免这种情况,您可以在upview方向之间测试dot产品,如果结果的abs大于0.7,则使用(1,0,0) (作为up或right或其他...)。

另外,由于我们对你的符号一无所知,我们不能确认你的矩阵设置是正确的(它可能是也可能不是,它可能被转置等)。有关更多信息,请查看:

但最有可能的是,您的矩阵也包含透视变换,通过设置它的单元格,您完全覆盖了它,从而导致没有透视,因此是2D输出。在这种情况下,您应该将原始透视矩阵与新矩阵相乘,并使用结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53467291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档