【问题标题】:LWJGL 3D MovementLWJGL 3D运动
【发布时间】:2014-12-02 19:05:32
【问题描述】:

我正在尝试使用 LWJGL 创建一个 FPS 相机,但我的代码似乎不起作用。 -_- 它只是在屏幕前创建一个白色块,玩家不能移动或旋转。 有什么问题?

public class LocalWindow 
{
public void Launch() 
{
    try 
    { 
        Display.setDisplayMode (new DisplayMode (800, 600));
        Display.setTitle("Historica");
        Display.create();
    } 
    catch (LWJGLException e) 
    {
            e.printStackTrace();
    }
}
public void Render()
{
    initMatrix();
    while (!Display.isCloseRequested())
            //&& !Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
    {

        initControls();
        frameRefresh();
        initCamera();




        Block s = new Block(0, 0, -4);
        s.setBlock();






        Display.update();
    }
}
private void initCamera()
{
    Camera player = new Camera();
    player.setView();
}
private void frameRefresh()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
}
private void initControls()
{
    Mouse.setGrabbed(true);
    Controls controls = new Controls();
    controls.moveForward(0.1f);
    controls.moveBackward(0.1f);
    controls.strafeLeft(0.1f);
    controls.strafeRight(0.1f);
    controls.lookingAround(0.1f);
}
private void initMatrix()
{
    Matrix matrix = new Matrix();
    matrix.initMatrix();
}

}

相机类:

public class Camera {
public float x;
public float y;
public float z;
public float rx;
public float ry;
public float rz;
public float fov = 70;
public float aspect = (float)Display.getWidth()/(float)Display.getHeight();
public float near = 0.3f;
public float far = 1000;
public float dx;
public float dy;



public void setView(){
    glRotatef(rx,1,0,0);
    glRotatef(ry,0,1,0);
    glRotatef(rz,0,0,1);
    glTranslatef(x,y,z);
}
}

控件类:

import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;


public class Controls extends Camera {
boolean W = Keyboard.isKeyDown(Keyboard.KEY_W);
boolean S = Keyboard.isKeyDown(Keyboard.KEY_S);
boolean A = Keyboard.isKeyDown(Keyboard.KEY_A);
boolean D = Keyboard.isKeyDown(Keyboard.KEY_D);

public void moveForward(float amount)
{
    if(W)
    {
    x += amount * Math.cos(Math.toRadians(ry + 90));
    z += amount * Math.sin(Math.toRadians(ry + 90));
    }
}

public void moveBackward(float amount)
{
    if(S)
    {
    x -= amount * Math.cos(Math.toRadians(ry + 90));
    z -= amount * Math.sin(Math.toRadians(ry + 90));
    }
}
public void strafeLeft(float amount)
{
    if(A);
    {
    x -= amount * (float)Math.sin(Math.toRadians(ry-90));
    z += amount * (float)Math.cos(Math.toRadians(ry-90));
    }
}
public void strafeRight(float amount)
{
    if(D)
    {  
    x -= amount * (float)Math.sin(Math.toRadians(ry+90));
    z += amount * (float)Math.cos(Math.toRadians(ry+90));
    }
}
public void lookingAround(float amount)
{
    dx = Mouse.getDX();
    dy = Mouse.getDY();
    ry += dx * amount;
    rx -= dy * amount;
}
}

矩阵类:

public class Matrix extends Camera{
public void initMatrix(){
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(fov, aspect, near, far);
    glMatrixMode(GL_MODELVIEW); 
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
}

}

类块完全正常工作(它在给定坐标上创建一个 3D 块)。

【问题讨论】:

  • 如果你是 openGL 新手,那么你不应该从立即模式管道开始

标签: java opengl 3d lwjgl


【解决方案1】:

您的相机不动的原因是您在每一帧中都创建了playercontrols 的新实例。除此之外,您仅在控件中更改成员,但使用播放器中的值来设置视图。

【讨论】:

  • 感谢您的回答!正确执行此操作的最佳方法是什么?
  • 创建一个Control类型的类成员,在Render开始时初始化一次,在initControls和initCamera中使用。但要明确一点:这是一个非常普遍的编程问题,因此在开始使用 3d 应用程序之前,您可能需要阅读更多有关面向对象编程的内容。
  • 非常感谢回复,我到底要学哪一章?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多