微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么球体在被 Opengl 绘制并进行透视投影时会变形?

如何解决为什么球体在被 Opengl 绘制并进行透视投影时会变形?

enter image description here

虽然其他物体没有扭曲或拉伸,但在透视投影后,我的球体变得扭曲了。

正交投影没问题,但使用 QMatrix4x4::perspective 投影时它会被拉伸。我希望它可以工作,但这里非常棘手。 绘制球体的代码如下:

    #include "ballshader.h"

#include <iostream>

void BallShader::initialize(float r)
{
  m_program.addCacheableShaderFromSourceFile(QOpenGLShader::Vertex,"vsrc.vsh");
   m_program.addCacheableShaderFromSourceFile(QOpenGLShader::Fragment,"fsrc.fsh");
if (m_program.link())
{
    std::cout << "link ok"<<std::endl;
}
//else
{
    std::cout << "link nok" << std::endl;
    
}

m_r = r;

/// p3    p2
///
/// p0    p1
///
int angleSpan = 10; //radian = angle * PI / 180
for (int vAngle = -90; vAngle <90; vAngle = vAngle + angleSpan) { //Generate spherical vertices
    for (int hAngle = 0; hAngle <= 360; hAngle = hAngle + angleSpan) {
        float x0 = r * ::cosf(vAngle * PI / 180.0) * ::cosf(hAngle * PI / 180.0);
        float y0 = r * ::cosf(vAngle * PI / 180.0) * ::sinf(hAngle * PI / 180.0);
        float z0 = r * ::sinf(vAngle * PI / 180.0);

        float x1 = r * ::cosf(vAngle * PI / 180.0) * ::cosf((hAngle + angleSpan) * PI / 180.0);
        float y1 = r * ::cosf(vAngle * PI / 180.0) * ::sinf((hAngle + angleSpan) * PI / 180.0);
        float z1 = r * ::sinf(vAngle * PI / 180.0);

        float x2 = r * ::cosf((vAngle + angleSpan) * PI / 180.0) * ::cosf((hAngle + angleSpan) * PI / 180.0);
        float y2 = r * ::cosf((vAngle + angleSpan) * PI / 180.0) * ::sinf((hAngle + angleSpan) * PI / 180.0);
        float z2 = r * ::sinf((vAngle + angleSpan) * PI / 180.0);

        float x3 = r * ::cosf((vAngle + angleSpan) * PI / 180.0) * ::cosf(hAngle * PI / 180.0);
        float y3 = r * ::cosf((vAngle + angleSpan) * PI / 180.0) * ::sinf(hAngle * PI / 180.0);
        float z3 = r * ::sinf((vAngle + angleSpan) * PI / 180.0);

        // p1 -> p3 -> p0
        // p1 -> p2 -> p3

        m_points
            << x1 << y1 << z1
            << x3 << y3 << z3
            << x0 << y0 << z0
            << x1 << y1 << z1
            << x2 << y2 << z2
            << x3 << y3 << z3;

            /*//normals
            << x1 / r << y1 / r << z1 / r
            << x3 / r << y3 / r << z3 / r
            << x0 / r << y0 / r << z0 / r
            << x1 / r << y1 / r << z1 / r
            << x2 / r << y2 / r << z2 / r
            << x3 / r << y3 / r << z3 / r;*/

    }
}
m_vbo.create();
m_vbo.bind();
m_vbo.allocate(m_points.constData(),m_points.count() * sizeof GLfloat);
m_vbo.release();
}

void BallShader::render(QOpenGLFunctions *f,QMatrix4x4 & projM,QMatrix4x4 & camera,QMatrix4x4 & model,const QVector3D &eye)
{

f->glClearColor(0.0,0.0,1.0f);
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
f->glEnable(GL_DEPTH_TEST);
f->glEnable(GL_CULL_FACE);
m_program.bind();
m_vbo.bind();
m_program.setUniformValue("uPMatrix",projM);
m_program.setUniformValue("camMatrix",camera);
m_program.setUniformValue("uMMatrix",model);
m_program.setUniformValue("uR",m_r);
m_program.setUniformValue("objectColor",1,0.3f,0.3f);
m_program.setUniformValue("lightColor",1);
m_program.setUniformValue("viewPos",eye);
m_program.setUniformValue("lightPos",eye);

m_program.enableAttributeArray(0);
m_program.setAttributeBuffer(0,GL_FLOAT,3,3 * sizeof(GL_FLOAT));

f->glDrawArrays(GL_TRIANGLES,m_points.count() / 3);

m_program.disableAttributeArray(0);
m_vbo.release();
m_program.release();
f->gldisable(GL_DEPTH_TEST);
f->gldisable(GL_CULL_FACE);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?