2014-04-13 79 views
5

我有問題需要了解libGDX中透視攝像頭的視野(或者我的計算錯誤)。libGDX - 透視攝像頭和視場

我想畫一個盒子(例如800px寬,480px高,20px深)。該框放置在x軸和y軸之間(換句話說:x軸上的寬度和y軸上的高度)。現在我想站在x軸(相機位置)上的方框後面,以這樣的方式查看方向,以便在我的右側屏幕上看到該方框。 我做了一些草圖:

drawing the box

camera on x-axis, looking at box

box should appear on right side

在最後草圖,盒子上的視場的右側。

此外,箱子的高度必須完全適合屏幕。換句話說:箱子的頂部邊緣必須位於我的屏幕頂部,而箱子的底部邊緣必須位於我的屏幕底部。 下面是一些代碼和計算來實現這一點:

public class Box implements ApplicationListener { 

public PerspectiveCamera camera; 
public float SCREEN_WIDTH; 
public float SCREEN_HEIGHT; 

@Override 
public void create() { 
    SCREEN_WIDTH = Gdx.graphics.getWidth(); // 800px 
    SCREEN_HEIGHT = Gdx.graphics.getHeight(); // 480px 

    // Create camera (90°) and set position 
    camera = new PerspectiveCamera(90f, SCREEN_WIDTH, SCREEN_HEIGHT); 
    camera.position.set(SCREEN_WIDTH + SCREEN_HEIGHT/2, SCREEN_HEIGHT/2, 0f); 
    camera.lookAt(0f, SCREEN_HEIGHT/2, 0f); 
    camera.near = 1; 
    camera.far = 2 * SCREEN_WIDTH; 
    camera.update(); 
} 

@Override 
public void render() { 
    Gdx.gl.glClearColor(Color.WHITE.r, Color.WHITE.g, Color.WHITE.b, Color.WHITE.a); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 

    // Build the box - width is screenwidth and height is screenheight - one corner in origin 
    ModelBuilder modelBuilder = new ModelBuilder(); 
    modelBuilder.begin(); 
    MeshPartBuilder mpb = modelBuilder.part("ID", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal, 
      new Material(ColorAttribute.createDiffuse(Color.GREEN))); 
    // bottom left corner of the box should be in (0,0,0) 
    mpb.box(SCREEN_WIDTH/2, SCREEN_HEIGHT/2, -10f, SCREEN_WIDTH, SCREEN_HEIGHT, 20f); 
    Model model = modelBuilder.end(); 
    ModelInstance instance = new ModelInstance(model); 

    // Build some light 
    Environment environment = new Environment(); 
    environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f)); 
    environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f)); 

    // Draw the box 
    ModelBatch modelBatch = new ModelBatch(); 
    modelBatch.begin(camera); 
    modelBatch.render(instance, environment); 
    modelBatch.end(); 
} 
} 

以適應屏幕的框的高度,我必須退一步SCREEN_HEIGHT/2,因爲X = SCREEN_HEIGHT/2 /黃褐色(45°)= SCREEN_HEIGHT/2/1 = SCREEN_HEIGHT/2,這就是爲什麼我將該長度添加到位置設置中的x分量。

代碼表示草圖2,給我正確的截圖:

screenshot of sketch 2

爲了實現草圖3,我必須45°左右旋轉的角度我場左側。但在這方面,我必須稍微退一步,因爲視野的兩側比中心線長。我做了兩個手繪草圖:

rotation of field of view

其中H = SCREEN_HEIGHT。首先,我必須計算x。 x = h/2/sin(45°)= h/sqrt(2)。現在,我必須退後一段距離,然後朝着一個新的方向(距離方框45°)尋找新的方向。爲了計算在我將看這一點​​,我計算的長度Y在這個草圖:

calculation y

Y = SIN(45°)* H/2 = H * SQRT(2)/ 4。所以,重點是例如(SCREEN_WIDTH +(x-y),SCREEN_HEIGHT/2,y)。現在我改變位置,看着點我的代碼:

public void create() { 
    SCREEN_WIDTH = Gdx.graphics.getWidth(); // 800px 
    SCREEN_HEIGHT = Gdx.graphics.getHeight(); // 480px 

    // Create camera (90°) and set position 
    camera = new PerspectiveCamera(90f, SCREEN_WIDTH, SCREEN_HEIGHT); 
    float x = (float) (SCREEN_HEIGHT/Math.sqrt(2)); 
    float y = (float) (SCREEN_HEIGHT * Math.sqrt(2)/4f); 
    camera.position.set(SCREEN_WIDTH + x, SCREEN_HEIGHT/2, 0f); 
    camera.lookAt(SCREEN_WIDTH + x - y, SCREEN_HEIGHT/2, y); 
    camera.near = 1; 
    camera.far = 2 * SCREEN_WIDTH; 
    camera.update(); 
} 

而且我得到這個畫面:

screenshot which should represent sketch 3

但框是不是在很右側:(

所以,現在的問題是:什麼是錯的?我的視野是錯誤的還是我的計算?

最好的問候!

回答

0

您對PerspectiveCamera的理解有點偏離,特別是它對第二個(viewportWidth)和第三個(viewportHeight)參數的做法。

PerspectiveCamera與他們做的唯一的事情就是獲得縱橫比並用它來設置projectionMatrix。對於它使用的特定代碼,請參見this line,計算寬高比,this method設置projectionMatrix

現在,這是一切都很好,除了你也做數學來處理寬高比,並做兩次導致相機再次拉伸。解決的辦法很簡單,無論是重做你的數學不調整寬高比或

camera = new PerspectiveCamera(90f, 1, 1); 

更換

camera = new PerspectiveCamera(90f, SCREEN_WIDTH, SCREEN_HEIGHT); 

使縱橫比libgdx計算是1

我不太擅長正弦和餘弦,所以我不能提供解決方案的第一個選項,但你似乎沒有任何困難的數學問題。