2017-04-23 78 views
1

我写了一个小程序,而只需发现OpenGL如何与SFML:增加摄影机视图距离

#include <SFML/Window.hpp> 
#include <SFML/OpenGL.hpp> 
#include <SFML/Graphics.hpp> 
int main(){ 
    sf::RenderWindow window(sf::VideoMode(700,700), 
     "OpenGL test", sf::Style::Default); 
    window.setFramerateLimit(60); 

    sf::Clock clock; 
    sf::Time time; 
    sf::Event event; 
    float dt; 
    bool run=true; 
    glClearColor(50/255.0f, 75/255.0f, 50/255.0f, 1.0f); 
    glTranslatef(0.0f, 0.0f, 1.0f); 
    while(run){ 
     while(window.pollEvent(event)) 
      if(event.type==sf::Event::Closed)run=false; 
     glRotatef(1.0f, 1.0f, 1.0f, -1.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glBegin(GL_LINE_STRIP); 
     glVertex3f(-0.5f, -0.5f, 0.0f); 
     glVertex3f(-0.5f, 0.5f, 0.0f); 
     glVertex3f(0.5f, 0.5f, 0.0f); 
     glVertex3f(0.5f, -0.5f, 0.0f); 
     glVertex3f(-0.5f, -0.5f, 0.0f); 
     glVertex3f(0.0f, 0.0f, -0.5f); 
     glVertex3f(0.5f, 0.5f, 0.0f); 
     glEnd(); 

     window.display(); 
    } 
    return 0; 
} 

但是当我运行它,对象的一部分消失:

enter image description here

是有没有办法增加观看距离?

回答

1

的OpenGL呈现最大值从-1到1之间的任何尺寸,所以你需要相对于标准化你的价值观。

离你有从0,0的线段,-2.0至0,0,-32.3:(假设-z从相机的距离) 你将不得不缩放每个矢量相应地适应:

p1 := {0, 0, -2.0} 
p2 := {0, 0, -32.3} 
p2len := length(p2) //In this case just 32.3 
p1 := {p1.x/p2len, p1.y/p2len, p1.z/p2len} // {0, 0, -0.0619} 
p2 := {p2.x/p2len, p2.y/p2len, p2.z/p2len} // {0, 0, -1} 
+0

但有没有办法增加opengl的最大尺寸? –

+0

@RoyVaron不是我所知道的。但你可以用数学来表示几乎所有的值范围......你还试过去除glTranslate(...)调用吗? – TinfoilPancakes

+0

@RoyVaron https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFrustum.xml 或google for glFrustrum – LeDYoM

1

只需在最后一次glVertex调用之前更改一次,即: glVertex3f(0.0f,0.0f,-0.5f); 至 glVertex3f(0.0f,0.0f,0.0f);

,然后,请,请,请阅读本:

https://www.sfml-dev.org/tutorials/2.4/window-opengl.php

+0

它没有工作,它只是改变了几何图形,并且部分对象仍然不可见。 –

+0

现在我明白了。你正在旋转场景。所以你必须自己配置视图矩阵,而不是使用正视图的SFML默认值。阅读我的链接,看看如何。或多或少发生了什么:SFML配置了一个“2D”视图,但是你想要一个3D视图,所以你需要推动他的矩阵视图,设置你的,渲染,弹出SFML矩阵。 – LeDYoM