java - 计算 LookAt 矩阵

标签 java opengl matrix jogl

我一直在尝试编写一个 View 矩阵/查看矩阵,但我的代码中的某个地方有错误,我需要帮助找到它。当我使用我的函数时,我得到一个空白屏幕,而不是我应该得到的三角形的测试 View 。

public static Mat4 lookAt(
float eyeX, float eyeY, float eyeZ,     //Where we are looking from
float centreX, float centreY, float centreZ, //Where we are looking to
float upX, float upY, float upZ)        //Which way is up
{
    Vec3 eye    = new Vec3(eyeX, eyeY, eyeZ);
    Vec3 target = new Vec3(centreX, centreY, centreZ);
    Vec3 up     = new Vec3(upX, upY, upZ);

    Vec3 zaxis = normal(subtract(target,eye)); // The "forward" vector.
    Vec3 xaxis = normal(cross(up, zaxis));     // The "right" vector.
    Vec3 yaxis = cross(zaxis, xaxis);          // The "up" vector.


    // [ right.x    right.y     right.z  0]
    // [   up.x       up.y       up.z    0]
    // [-forward.x -forward.y -forward.z 0]
    // [    0         0           0      1]

    Mat4 orientation = new Mat4(
       new Vec4( xaxis.get()[0], yaxis.get()[0], -zaxis.get()[0], +0.0f ),  //Column 1 
       new Vec4( xaxis.get()[1], yaxis.get()[1], -zaxis.get()[1], +0.0f ),  //Column 2 
       new Vec4( xaxis.get()[2], yaxis.get()[2], -zaxis.get()[2], +0.0f ),  //Column 3 
       new Vec4( +0.0f, +0.0f,  +0.0f,  +1.0f)                  //Column 4 
       ); 

Mat4 translation = new Mat4 (
        new Vec4( +1.0f, +0.0f, +0.0f, +0.0f ), //Column 1
        new Vec4( +0.0f, +1.0f, +0.0f, +0.0f ), //Column 2
        new Vec4( +0.0f, +0.0f, +1.0f, +0.0f ), //Column 3
        new Vec4( -eye.get()[0], -eye.get()[1], -eye.get()[2], +1.0f)   //Column 4
        );      

    return multiply(orientation, translation);
}

这适用于右手坐标系。所有矩阵都是列主矩阵;它们从 a11 开始构建,向下移动第一列到 a41,然后到 a12,依此类推到 a44。

我已经检查了以下函数,我相当确定它们是正确的,但我将它们包含在内,以防万一我忽略了某些内容:

Vec3 normal(Vec3 a)
{
    Vec3 unit;

    float[] v_a = a.get();
    float   v_mag = magnitude(a);

    unit = new Vec3(v_a[0]/v_mag, v_a[1]/v_mag, v_a[2]/v_mag);

    return unit;
}

--

float magnitude(Vec3 a)
{
    float[] v_a = a.get();


    return( (float)Math.sqrt(
    Math.pow( (double)v_a[0], 2) +
    Math.pow( (double)v_a[1], 2) +
    Math.pow( (double)v_a[2], 2)
    )   // -- end sqrt --
); // -- return --
}

--

Vec3 cross(Vec3 a, Vec3 b)
{
    Vec3 crossProduct;

    float[] v_a = a.get();
    float[] v_b = b.get();

    crossProduct = new Vec3(
       v_a[1]*v_b[2] - v_a[2]*v_b[1],   //cx = ay*bz - az*by
       v_a[2]*v_b[0] - v_a[0]*v_b[2],   //cy = az*bx - ax*bz
       v_a[0]*v_b[1] - v_a[1]*v_b[0]    //cz = ax*by - ay*bz
   ); 

return(crossProduct);
}

所有 vector 分配都是正确的。 get() 返回一个 float[]。

最佳答案

您似乎正在使用与本页描述的算法类似的算法: http://www.cs.virginia.edu/~gfx/Courses/1999/intro.fall99.html/lookat.html .

看来您否定了方向矩阵中的错误内容。当您实际上应该对方向矩阵中的整个 z 轴 vector 取反时,您对每个轴 vector 的 z 分量取反。

关于java - 计算 LookAt 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22878201/

相关文章:

c - 在C中定义一个函数以从用户处获取二维矩阵的元素

尽管限制访问,Java 类变量并不是不可变的

java - 有没有更好的方法来处理国家及其州/省/地区列表?

java - Logback 配置忽略了我的日志记录级别

java - 如果 bean 初始化失败,则停止 spring web 应用程序

c++ - Qtopengl,为什么不能使用不同的 vbo 绘制两个立方体

matrix - crc32_combine() 的矩阵技巧的逆是什么?

java - 在 Android 中代表用户发送短信

python - 为什么我的 OpenGL 程序无法加载 GLUT 位图字体?

c - 仅使用 VAO id 检索链接到 VAO 的 VBO 数量及其 id,这可能吗?