ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 需要帮助理解这个旋转矩阵数学代码

2019-06-13 01:58:46  阅读:251  来源: 互联网

标签:java graphics matrix opengl transformation


private Mat4 calcLookAtMatrix(Vec3 cameraPt, Vec3 lookPt, Vec3 upPt) {
    Vec3 lookDir = Glm.normalize(Vec3.sub(lookPt, cameraPt));
    Vec3 upDir = Glm.normalize(upPt);

    Vec3 rightDir = Glm.normalize(Glm.cross(lookDir, upDir));
    Vec3 perpUpDir = Glm.cross(rightDir, lookDir);

    Mat4 rotMat = new Mat4(1.0f);
    rotMat.setColumn(0, new Vec4(rightDir, 0.0f));
    rotMat.setColumn(1, new Vec4(perpUpDir, 0.0f));
    rotMat.setColumn(2, new Vec4(Vec3.negate(lookDir), 0.0f));

    rotMat = Glm.transpose(rotMat);

    Mat4 transMat = new Mat4(1.0f);
    transMat.setColumn(3, new Vec4(Vec3.negate(cameraPt), 1.0f));

    return rotMat.mul(transMat);
}

此代码生成一个世界到相机矩阵,将与openGL一起用于渲染.

我理解旋转矩阵的形成方式.基本上,它放入归一化向量并转置矩阵,并以某种方式产生旋转矩阵.解释数学.

解决方法:

变换矩阵将顶点从一个空间转换为另一个空间.假设初始空间是空间A,最后的空间是空间B.

空间A和空间B都由series of basis vectors定义.因此空间A具有一些基矢量和原点.但是,如果您想以数字方式讨论基础向量,则必须相对于其他空间来讨论它们.否则,数字没有意义,因为空格定义了向量中的数字意味着什么.

从空间A到空间B的变换矩阵是空间A相对于空间B表示的基矢量.变换的第一列是空间A的X轴相对于空间B的方向.第二列是A的Y轴和第三个是A的Z轴.

代码正在做的是相对于给定的世界空间(由给出的三个向量定义)生成相机空间的基矢量.因此,它构建了一个矩阵,在相机空间中获取顶点并将它们吐出世界空间.

然而,它想要生成的矩阵是从世界空间到相机空间的转换.所以它之前反转了矩阵; A-to-B矩阵的逆是B-to-A矩阵.有趣的事实:纯旋转矩阵的逆与其转置相同,这也更容易计算.

标签:java,graphics,matrix,opengl,transformation
来源: https://codeday.me/bug/20190613/1229787.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有