Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当代理移动时,旋转形状将与摄影机一起移动_Java_Opengl_Graphics_3d_Jogl - Fatal编程技术网

Java 当代理移动时,旋转形状将与摄影机一起移动

Java 当代理移动时,旋转形状将与摄影机一起移动,java,opengl,graphics,3d,jogl,Java,Opengl,Graphics,3d,Jogl,我创建了一个3D游戏,其中一个代理可以向多个方向移动(北,南…) 它可以正常工作,但当我在代码中添加另一个形状-金字塔时 移动代理,金字塔会随着他移动,这意味着它会随着代理(又名摄影机)的移动而移动 知道如何使形状保持静止吗 启用行gl2.glLoadIdentity()使棱锥体与摄影机粘住。禁用gl2.glLoadIdentity()使棱锥体不显示 代码: class WorldController extends GLCanvas implements GLEventListener, Ke

我创建了一个3D游戏,其中一个代理可以向多个方向移动(北,南…)

它可以正常工作,但当我在代码中添加另一个形状-金字塔时 移动代理,金字塔会随着他移动,这意味着它会随着代理(又名摄影机)的移动而移动

知道如何使形状保持静止吗

启用行
gl2.glLoadIdentity()使棱锥体与摄影机粘住。禁用
gl2.glLoadIdentity()使棱锥体不显示

代码:

class WorldController extends GLCanvas implements GLEventListener, KeyListener 
{
    private Point3D m_agent , m_center , m_coordinate1 , m_coordinate2 , m_coordinate3;
    private GLU m_glu = new GLU();
    private Pyramid m_pyra = new Pyramid();

        public WorldController ()
    {
        this.addGLEventListener(this);

        //  initialize m_agent and axis
        this.m_agent = new Point3D(750,200,1200);
        this.m_coordinate1 = new Point3D(1,0,0);
        this.m_coordinate2 = new Point3D(0,1,0);
        this.m_coordinate3 = new Point3D(0,0,1);
        this.m_center = new Point3D(0,0,0);
    }

        @Override
    public void init (GLAutoDrawable gLDrawable) 
    {

        GL2 gl2 = gLDrawable.getGL().getGL2(); // get the OpenGL graphics context
        gl2.glEnable(GL2.GL_TEXTURE_2D);          // get GL Utilities
        gl2.glShadeModel(GL2.GL_SMOOTH);
        gl2.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl2.glClearDepth(1.0f);
        gl2.glEnable(GL2.GL_DEPTH_TEST);
        gl2.glDepthFunc(GL2.GL_LEQUAL);
        gl2.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
        gl2.glShadeModel(GL_SMOOTH); // blends colors nicely, and smoothes out lighting


        // bind the pyramid with the current GL2
        this.m_pyra.createPyramid(gl2);

        /**
         * Creating the listener 
         */
        ((Component) gLDrawable).addKeyListener(this);

    }


        @Override
    public void display(GLAutoDrawable gLDrawable)
    {
        final GL2 gl2 = gLDrawable.getGL().getGL2();
        gl2.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
        gl2.glLoadIdentity();

        //  set m_center and look at
        m_center.setPoint(m_agent.getX() - m_coordinate3.getX() , 
                   m_agent.getY() - m_coordinate3.getY() ,
                   m_agent.getZ() - m_coordinate3.getZ());

        m_glu.gluLookAt(m_agent.getX(),m_agent.getY(),m_agent.getZ(),
                      m_center.getX(),m_center.getY(),m_center.getZ(),
                      m_coordinate2.getX(),m_coordinate2.getY(),m_coordinate2.getZ());


        /**
         * pyramid 
         */

        gl2.glPushMatrix();
        // gl2.glLoadIdentity(); 
        gl2.glTranslatef(-2f, 0.0f, -10.0f); // translate left and into the screen
        gl2.glRotatef(anglePyramid, 0.1f, 1.0f, -0.1f); // rotate about the y-axis
        gl2.glCallList(5);
        gl2.glPopMatrix();   // <-- and here?
        anglePyramid += speedPyramid;

    }


    @Override
    public void reshape(GLAutoDrawable gLDrawable,int x,int y,int width,int height) 
    {

        GL2 gl2 = gLDrawable.getGL().getGL2(); // get the OpenGL 2 graphics context
        if(height <= 0) height = 1;            // prevent divide by zero

        float aspect = (float)width / (float)height;
        gl2.glMatrixMode(GL_PROJECTION);
        gl2.glLoadIdentity();
        m_glu.gluPerspective(50.0f, aspect, 1.0, 10000.0);
        gl2.glMatrixMode(GL_MODELVIEW);
        gl2.glLoadIdentity();
    }
}
类:Pyramid.java

import javax.media.opengl.GL2;


public class Pyramid {


    private int m_pyramid;


    public void createPyramid(GL2 gl2) 
    {
        m_pyramid = gl2.glGenLists(1);
        gl2.glNewList(m_pyramid, GL2.GL_COMPILE);

        //  set texture parameters
        gl2.glTexParameteri ( GL2.GL_TEXTURE_2D,GL2.GL_TEXTURE_WRAP_T,GL2.GL_LINEAR_MIPMAP_LINEAR);
        gl2.glTexParameteri( GL2.GL_TEXTURE_2D,GL2.GL_TEXTURE_WRAP_S,GL2.GL_LINEAR_MIPMAP_LINEAR);

        gl2.glBegin(GL2.GL_TRIANGLES); // of the pyramid

        // Font-face triangle
        gl2.glTexCoord3f(1.0f, 0.0f, 0.0f);  // Red
        gl2.glVertex3d(0.0f, 1.0f, 0.0f);
        gl2.glTexCoord3f(0.0f, 1.0f, 0.0f);  // Green
        gl2.glVertex3d(-1.0f, -1.0f, 1.0f);
        gl2.glTexCoord3f(0.0f, 0.0f, 1.0f);  // Blue
        gl2.glVertex3d(1.0f, -1.0f, 1.0f);

        // Right-face triangle
        gl2.glTexCoord3f(1.0f, 0.0f, 0.0f);  // Red
        gl2.glVertex3d(0.0f, 1.0f, 0.0f);
        gl2.glTexCoord3f(0.0f, 0.0f, 1.0f);  // Blue
        gl2.glVertex3d(1.0f, -1.0f, 1.0f);
        gl2.glTexCoord3f(0.0f, 1.0f, 0.0f);  // Green
        gl2.glVertex3d(1.0f, -1.0f, -1.0f);

        // Back-face triangle
        gl2.glTexCoord3f(1.0f, 0.0f, 0.0f);  // Red
        gl2.glVertex3d(0.0f, 1.0f, 0.0f);
        gl2.glTexCoord3f(0.0f, 1.0f, 0.0f);  // Green
        gl2.glVertex3d(1.0f, -1.0f, -1.0f);
        gl2.glTexCoord3f(0.0f, 0.0f, 1.0f);  // Blue
        gl2.glVertex3d(-1.0f, -1.0f, -1.0f);

        // Left-face triangle
        gl2.glTexCoord3f(1.0f, 0.0f, 0.0f);  // Red
        gl2.glVertex3d(0.0f, 1.0f, 0.0f);
        gl2.glTexCoord3f(0.0f, 0.0f, 1.0f);  // Blue
        gl2.glVertex3d(-1.0f, -1.0f, -1.0f);
        gl2.glTexCoord3f(0.0f, 1.0f, 0.0f);  // Green
        gl2.glVertex3d(-1.0f, -1.0f, 1.0f);

        gl2.glEnd(); // of the pyramid
        gl2.glEndList();

    }

}
WorldController.java

class WorldController extends GLCanvas implements GLEventListener, KeyListener 
{
    private Point3D m_agent , m_center , m_coordinate1 , m_coordinate2 , m_coordinate3;
    private GLU m_glu = new GLU();
    private Pyramid m_pyra = new Pyramid();

        public WorldController ()
    {
        this.addGLEventListener(this);

        //  initialize m_agent and axis
        this.m_agent = new Point3D(750,200,1200);
        this.m_coordinate1 = new Point3D(1,0,0);
        this.m_coordinate2 = new Point3D(0,1,0);
        this.m_coordinate3 = new Point3D(0,0,1);
        this.m_center = new Point3D(0,0,0);
    }

        @Override
    public void init (GLAutoDrawable gLDrawable) 
    {

        GL2 gl2 = gLDrawable.getGL().getGL2(); // get the OpenGL graphics context
        gl2.glEnable(GL2.GL_TEXTURE_2D);          // get GL Utilities
        gl2.glShadeModel(GL2.GL_SMOOTH);
        gl2.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl2.glClearDepth(1.0f);
        gl2.glEnable(GL2.GL_DEPTH_TEST);
        gl2.glDepthFunc(GL2.GL_LEQUAL);
        gl2.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
        gl2.glShadeModel(GL_SMOOTH); // blends colors nicely, and smoothes out lighting


        // bind the pyramid with the current GL2
        this.m_pyra.createPyramid(gl2);

        /**
         * Creating the listener 
         */
        ((Component) gLDrawable).addKeyListener(this);

    }


        @Override
    public void display(GLAutoDrawable gLDrawable)
    {
        final GL2 gl2 = gLDrawable.getGL().getGL2();
        gl2.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
        gl2.glLoadIdentity();

        //  set m_center and look at
        m_center.setPoint(m_agent.getX() - m_coordinate3.getX() , 
                   m_agent.getY() - m_coordinate3.getY() ,
                   m_agent.getZ() - m_coordinate3.getZ());

        m_glu.gluLookAt(m_agent.getX(),m_agent.getY(),m_agent.getZ(),
                      m_center.getX(),m_center.getY(),m_center.getZ(),
                      m_coordinate2.getX(),m_coordinate2.getY(),m_coordinate2.getZ());


        /**
         * pyramid 
         */

        gl2.glPushMatrix();
        // gl2.glLoadIdentity(); 
        gl2.glTranslatef(-2f, 0.0f, -10.0f); // translate left and into the screen
        gl2.glRotatef(anglePyramid, 0.1f, 1.0f, -0.1f); // rotate about the y-axis
        gl2.glCallList(5);
        gl2.glPopMatrix();   // <-- and here?
        anglePyramid += speedPyramid;

    }


    @Override
    public void reshape(GLAutoDrawable gLDrawable,int x,int y,int width,int height) 
    {

        GL2 gl2 = gLDrawable.getGL().getGL2(); // get the OpenGL 2 graphics context
        if(height <= 0) height = 1;            // prevent divide by zero

        float aspect = (float)width / (float)height;
        gl2.glMatrixMode(GL_PROJECTION);
        gl2.glLoadIdentity();
        m_glu.gluPerspective(50.0f, aspect, 1.0, 10000.0);
        gl2.glMatrixMode(GL_MODELVIEW);
        gl2.glLoadIdentity();
    }
}
class WorldController扩展了GLCanvas实现了GLEventListener、KeyListener
{
private Point3D m_agent、m_center、m_coordinate1、m_coordinate2、m_coordinate3;
私有GLU m_GLU=新GLU();
私有金字塔m_pyra=新金字塔();
公共财务总监()
{
this.addGLEventListener(this);
//初始化m_代理和axis
this.m_agent=new Point3D(7502001200);
此.m_坐标1=新点3d(1,0,0);
这个.m_坐标2=新的点3d(0,1,0);
此.m_坐标3=新点3d(0,0,1);
此m_中心=新点3D(0,0,0);
}
@凌驾
公共void init(GLAutoDrawable gLDrawable)
{
GL2 GL2=gLDrawable.getGL().getGL2();//获取OpenGL图形上下文
gl2.glEnable(gl2.GL_纹理_2D);//获取GL实用程序
gl2.glShadeModel(gl2.GLU平滑);
gl2.glClearColor(0.0f,0.0f,0.0f,0.0f);
gl2.glClearDepth(1.0f);
gl2.glEnable(gl2.GLU深度测试);
gl2.glDepthFunc(gl2.GL_LEQUAL);
gl2.glHint(gl2.GL\u透视图\u校正\u提示,gl2.GL\u最佳);
gl2.glShadeModel(GL_SMOOTH);//很好地混合颜色,并平滑照明
//将棱锥体与当前GL2绑定
这个.m_pyra.createPyramid(gl2);
/**
*创建侦听器
*/
((组件)gLDrawable.addKeyListener(此);
}
@凌驾
公共空白显示(GLAutoDrawable gLDrawable)
{
最终GL2 GL2=gLDrawable.getGL().getGL2();
gl2.glClear(gl2.GL_颜色_缓冲_位| gl2.GL_深度_缓冲_位);
gl2.glLoadIdentity();
//设置m_中心并查看
m_中心设定点(m_代理.getX()-m_坐标3.getX(),
m_agent.getY()-m_coordinate3.getY(),
m_agent.getZ()-m_coordinate3.getZ();
m_glu.gluLookAt(m_agent.getX(),m_agent.getY(),m_agent.getZ(),
m_center.getX(),m_center.getY(),m_center.getZ(),
m_coordinate2.getX(),m_coordinate2.getY(),m_coordinate2.getZ();
/**
*金字塔
*/
gl2.glPushMatrix();
//gl2.glLoadIdentity();
gl2.glTranslatef(-2f,0.0f,-10.0f);//向左平移并平移到屏幕中
gl2.glRotatef(角度棱锥体,0.1f,1.0f,-0.1f);//绕y轴旋转
gl2.glCallList(5);

gl2.glPopMatrix();//我猜您在世界坐标和相机坐标之间进行了不正确的矩阵变换。glLoadIdentity所做的只是将您的初始引用设置为标识矩阵,如果您没有正确进行变换,它可能位于您的头顶上

见此:

我建议您从display函数中删除生成显示列表的代码。将其放入init函数或用于初始化对象的任何函数中

第二,只在生成代码中放入对构建对象(金字塔)很重要的转换和定义。不要在其中放入任何与将其定位到世界系统相关的转换。请记住,它只需生成一次,并且,当列表名称有效时,您只需反复调用它即可将其显示到帧缓冲区中

不要将glLoadIdentity()放在显示列表中,它们会重置模型视图矩阵,我相信这不是您想要的。要保留模型视图矩阵的内容,可以使用矩阵堆栈子系统,方法是使用glPushMatrix和glPopMatrix函数调用

因此,关于您的代码,我建议进行以下修改:

@Override
public void init (GLAutoDrawable gLDrawable) 
{

    GL2 gl2 = gLDrawable.getGL().getGL2(); // get the OpenGL graphics context
    gl2.glEnable(GL2.GL_TEXTURE_2D);          // get GL Utilities
    gl2.glShadeModel(GL2.GL_SMOOTH);
    gl2.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    gl2.glClearDepth(1.0f);
    gl2.glEnable(GL2.GL_DEPTH_TEST);
    gl2.glDepthFunc(GL2.GL_LEQUAL);
    gl2.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
    gl2.glShadeModel(GL_SMOOTH); // blends colors nicely, and smoothes out lighting
    ((Component) gLDrawable).addKeyListener(this);

    // ADDED HERE, OR IN ANY POSITION THAT MAKE MORE SENSE
    int pyramid = gl2.glGenLists(1);
    gl2.glNewList(pyramid, GL2.GL_COMPILE);
    // gl2.glLoadIdentity();  // reset the model-view matrix  <-- TAKE THIS OFF
    gl2.glBegin(GL2.GL_TRIANGLES); // of the pyramid

    // Font-face triangle
    gl2.glTexCoord3f(1.0f, 0.0f, 0.0f);  // Red
    gl2.glVertex3d(0.0f, 1.0f, 0.0f);
    gl2.glTexCoord3f(0.0f, 1.0f, 0.0f);  // Green
    gl2.glVertex3d(-1.0f, -1.0f, 1.0f);
    gl2.glTexCoord3f(0.0f, 0.0f, 1.0f);  // Blue
    gl2.glVertex3d(1.0f, -1.0f, 1.0f);

    // Right-face triangle
    gl2.glTexCoord3f(1.0f, 0.0f, 0.0f);  // Red
    gl2.glVertex3d(0.0f, 1.0f, 0.0f);
    gl2.glTexCoord3f(0.0f, 0.0f, 1.0f);  // Blue
    gl2.glVertex3d(1.0f, -1.0f, 1.0f);
    gl2.glTexCoord3f(0.0f, 1.0f, 0.0f);  // Green
    gl2.glVertex3d(1.0f, -1.0f, -1.0f);

    // Back-face triangle
    gl2.glTexCoord3f(1.0f, 0.0f, 0.0f);  // Red
    gl2.glVertex3d(0.0f, 1.0f, 0.0f);
    gl2.glTexCoord3f(0.0f, 1.0f, 0.0f);  // Green
    gl2.glVertex3d(1.0f, -1.0f, -1.0f);
    gl2.glTexCoord3f(0.0f, 0.0f, 1.0f);  // Blue
    gl2.glVertex3d(-1.0f, -1.0f, -1.0f);

    // Left-face triangle
    gl2.glTexCoord3f(1.0f, 0.0f, 0.0f);  // Red
    gl2.glVertex3d(0.0f, 1.0f, 0.0f);
    gl2.glTexCoord3f(0.0f, 0.0f, 1.0f);  // Blue
    gl2.glVertex3d(-1.0f, -1.0f, -1.0f);
    gl2.glTexCoord3f(0.0f, 1.0f, 0.0f);  // Green
    gl2.glVertex3d(-1.0f, -1.0f, 1.0f);


    gl2.glEnd(); // of the pyramid
    gl2.glEndList();

    // END HERE
}


@Override
public void display(GLAutoDrawable gLDrawable)
{
    final GL2 gl2 = gLDrawable.getGL().getGL2();
    gl2.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
    gl2.glLoadIdentity();

    // agent and center settings
    m_center.setPoint(m_agent.getX() - m_coordinate3.getX() , 
               m_agent.getY() - m_coordinate3.getY() ,
               m_agent.getZ() - m_coordinate3.getZ());

    m_glu.gluLookAt(m_agent.getX(),m_agent.getY(),m_agent.getZ(),
                  m_center.getX(),m_center.getY(),m_center.getZ(),
                  m_coordinate2.getX(),m_coordinate2.getY(),m_coordinate2.getZ());


     /**
     * pyramid 
     */

    glPushMatrix();  // <-- did you note this function here?

    gl2.glTranslatef(-2f, 0.0f, -10.0f); // translate left and into the screen
    gl2.glRotatef(anglePyramid, 0.1f, 1.0f, -0.1f); // rotate about the y-axis

    gl2.glCallList(pyramid);
    glPopMatrix();   // <-- and here?
    anglePyramid += speedPyramid;

m_center.setPoint…?这个函数的作用是什么?我想你的问题可能就在这里。

在代码中,你把相机放在哪里了?我只看到画金字塔的代码。@TomásBadan:请查看编辑过的代码按照你的建议更改代码后,金字塔不会显示给用户。请查看新的代码如果我启用了身份矩阵,那么它将返回到初始问题-摄影机和形状一起。顺便说一句,
m_中心
m_glu.gluLookAt(…)
您上面提到的是设置代理的视口,因此他可以从屏幕中心开始移动,而不是从矩形房间的任意一侧。好的,您的问题是gluLookAt。它指向一个没有对象的空间。如果您想测试它,我建议将其修改为
gluLookAt(m_-agent.getX(),m_-agent.getY(),m_-agent.getZ(),-2,0,-10,m_-coordinate2.getX(),m_-coordinate2.getY(),m_-coordinate2.getZ())
。如您所见,第二个坐标指向对象。请参见上图:第一个是您请求的更改,第二个是“常规”行。在这两种情况下,金字塔都会随我一起移动,前提是我允许
gl2.glLoadIdentity();
当您启用glLoadIdentity时,您将删除glLookAt设置的效果。如果您没有看到此对象,可能是因为您在视图之外的点上绘制。从您的代码来看,代理是在点上生成的(500,100,1000)并且正朝着一个点(500,100,999)看,而你的金字塔位于