我有問題需要了解libGDX中透視攝像頭的視野(或者我的計算錯誤)。libGDX - 透視攝像頭和視場
我想畫一個盒子(例如800px寬,480px高,20px深)。該框放置在x軸和y軸之間(換句話說:x軸上的寬度和y軸上的高度)。現在我想站在x軸(相機位置)上的方框後面,以這樣的方式查看方向,以便在我的右側屏幕上看到該方框。 我做了一些草圖:
在最後草圖,盒子上的視場的右側。
此外,箱子的高度必須完全適合屏幕。換句話說:箱子的頂部邊緣必須位於我的屏幕頂部,而箱子的底部邊緣必須位於我的屏幕底部。 下面是一些代碼和計算來實現這一點:
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,給我正確的截圖:
爲了實現草圖3,我必須45°左右旋轉的角度我場左側。但在這方面,我必須稍微退一步,因爲視野的兩側比中心線長。我做了兩個手繪草圖:
其中H = SCREEN_HEIGHT。首先,我必須計算x。 x = h/2/sin(45°)= h/sqrt(2)。現在,我必須退後一段距離,然後朝着一個新的方向(距離方框45°)尋找新的方向。爲了計算在我將看這一點,我計算的長度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();
}
而且我得到這個畫面:
但框是不是在很右側:(
所以,現在的問題是:什麼是錯的?我的視野是錯誤的還是我的計算?
最好的問候!