- 已关闭**。此问题需要超过focused。当前不接受答案。
- 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
23小时前关门了。
Improve this question
我正在创建一个"游戏",你可以驾驶一架直升机,你可以在一个模拟景观的网格中与相机一起移动(有不同的高度,如山或湖)。
为了做到这一点,我创建了一个四边形网格,给出了创建景观的尺寸和分辨率,然后使用一个函数,根据景观的x和y创建不同的高度,然后我给它纹理。
为了制作引导摄像头,我使用了LookAt函数:
// girox & giroy calculate the rotation of the camera with the left button
giroy = anguloV * PI / 180;
girox = (anguloH + anguloMov) * PI / 180;
//posx, posy & posz are the position of the pilot
gluLookAt(posx, posy, posz, posx + cos(giroy)*cos(girox),
posy + sin(girox)*cos(giroy), posz + sin(giroy), 0, 0, 1);
现在我有了一个风景和一个飞行员来导航它。我被要求创建一个驾驶舱与一个png混合。为此,我被要求在飞行员的位置创建一个球体,并添加驾驶舱的纹理到它。为了观看驾驶舱,我必须使用正交相机(glOrtho我猜)。
我想创建一个函数"cockpit()"来创建一个跟随我的位置的球体,然后添加驾驶舱的纹理,但是我不知道怎么做,更不知道如何使用正交相机,如果在显示器或新函数中使用它。
我将添加一个示例,说明它最终必须是什么。cockpit in landscape
1条答案
按热度按时间ryhaxcpt1#
你不需要使用一个单独的正交相机,你所寻找的是所谓的立方体图。他们通常用于天空或背景图像,是特殊的纹理与6面围绕相机。通过抽象,他们被想象成一个球体和在片段着色器,像素是访问一个向量指向方向的像素从原点。但是在硬件实现中,因为立方体比球体具有更少的面并且GPU中的纹理是正方形,所以它们被实现为立方体的6个面。
您可以观看此视频了解更多信息,其中涵盖了您需要的大部分实现。https://www.youtube.com/watch?v=8sVvxeKI9Pk&ab_channel=VictorGordan
与视频不同;
1-需要将顶点着色器中每个顶点的z值设置为0,以在其他每个几何体前面绘制直升机。
2-要使直升机的窗口透明,您需要找到一个rgba格式的直升机立方体图,如果alpha值未来0.1,则放弃碎片着色器。
if(color.a < 0.1f) discard;
这样您就不会覆盖先前渲染的场景。如果您无法获得rgba立方体图,则可以尝试为这些透明区域指定特定颜色(可能是白色?)并在片段着色器中检查该颜色。在这种情况下,请确保在一个范围内检查,而不是准确的颜色,以避免出现截断错误。