让太阳保持在同一个位置

时间:2016-02-08 22:42:49

标签: opengl math glsl

我使用简单的圆形绘制着色器在OpenGL中绘制一个圆圈,该着色器在传入的点周围绘制一个圆。该点需要在x和y中的屏幕空间坐标i,e,1到-1中。 / p>

问题在于绘制的圆不会像真正的太阳一样停留在相同的位置,与场景中的其他对象相比,它似乎过度旋转。这是因为它与SkyBox不同步。

传递到SkyBox的矩阵是:

    m_activeCamera.m_projectionMatrix *  
    m_activeCamera.m_viewMatrix * 
    glm::translate(mat4(1.0), m_activeCamera.m_position));

到目前为止,对太阳光位置的计算:

vec4 returnPos = pos;
returnPos.w = 1.0f;
returnPos = projection * (view * returnPos);
return vec2(returnPos.x / returnPos.w, returnPos.y / returnPos.w);

传递给此函数(pos)的位置是:

SUN.position + m_activeCamera.position

视图和投影矩阵属于m_activeCamera。

帮助解释问题的图片:

起始位置 enter image description here

如果我将相机从左向右移动,则太阳相对于天空盒保持原位。

enter image description here

如果我旋转相机,太阳会与天空盒一起移出。

enter image description here

1 个答案:

答案 0 :(得分:0)

问题在于" GetNDCCoords"如果当然太阳在屏幕上,函数在X和Y中返回-1和1之间的点。绘制圆的函数需要在屏幕空间0到1中的位置。这可以通过一个简单的公式解决:

screenPos.x = NDC.x * 0.5 + 0.5;
screenPos.y = NDC.y * 0.5 + 0.5;

现在太阳保持固定。