2021-10-29

jogl的 代码

配置 jogl

拷贝 jogl_lib和natives 到工作路径。
jogl_lib里面的文件添加到classpath里面。
下面是代码,亲测可用。
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JPanel;

import com.jogamp.opengl.GL2;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLEventListener;
import com.jogamp.opengl.GLProfile;
import com.jogamp.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.FPSAnimator;
 
public class My3dConponent implements GLEventListener, Runnable {

	private float angle = 0.0f;
	
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		
	}

	@Override
	public void display(GLAutoDrawable drawable) {

		// 绘制代码
        final GL2 gl = drawable.getGL().getGL2();


        gl.glColor3f(0.2f, 0.9f, 0.1f);

        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glRotated(angle, 0.0f, 1.0f, 0.0f);

        // 光照
        gl.glEnable(GL2.GL_LIGHTING);
        gl.glEnable(GL2.GL_LIGHT0);
        gl.glEnable(GL2.GL_NORMALIZE);//为了在使用缩放的情况下仍然保证法向量为单位长度

        // 设置光源
        float[] ambientLight = { 1.0f, 1.0f, 1.0f, 0.0f };//环境光一般这么设置
        float[] diffuseLight = { 1.0f, 1.0f, 1.0f, 0.0f};//漫反射光一般设置成和环境光一致
        float[] specularLight={0.1f, 0.2f, 0.6f, 0.0f};
        float[] positionLight = { -0.9f, 0.9f, 0.9f, 1.0f };
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);
        gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_SPECULAR, specularLight,0);
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, positionLight, 0);

        // 设置光照模型
        float[] ambientModel = { 0.4f, 0.4f, 0.4f, 1.0f };
        float[] viewLmodel = { 0.0f, 0.0f, 0.0f, 1.0f };
        gl.glLightModelfv(GL2.GL_LIGHT_MODEL_AMBIENT, ambientModel, 0);
        gl.glLightModelfv(GL2.GL_LIGHT_MODEL_LOCAL_VIEWER, viewLmodel, 0);

        //设置物体材质
//      float[] ambientMat={1.0f,1.0f,1.0f,0.0f};
//      float[] diffuseMat={1.0f,1.0f,1.0f,0.0f};
//      float[] specularMat={1.0f,1.0f,1.0f,1.0f};
//      float[] emissionMat={0.3f,0.2f,0.2f,0.0f};
//      float shininess=100.0f;//镜面反射系数
//        gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_AMBIENT,ambientMat,0);
//        gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_DIFFUSE,diffuseMat,0);
//        gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_SPECULAR,specularMat,0);
//        gl.glMaterialfv(GL2.GL_FRONT,GL2.GL_EMISSION,emissionMat,0);
//        gl.glMaterialf(GL2.GL_FRONT,GL2.GL_SHININESS,shininess);

        gl.glBegin(GL2.GL_POLYGON);
        gl.glNormal3f(0.0f,0.0f, 1.0f);//指定法向量
        gl.glVertex3f(0f, 0.5f, 0f);
        gl.glVertex3f(-0.5f, 0.2f, 0f);
        gl.glVertex3f(-0.5f, -0.2f, 0f);
        gl.glVertex3f(0f, -0.5f, 0f);
        gl.glVertex3f(0f, 0.5f, 0f);
        gl.glVertex3f(0.5f, 0.2f, 0f);
        gl.glVertex3f(0.5f, -0.2f, 0f);
        gl.glVertex3f(0f, -0.5f, 0f);
        gl.glEnd();
        gl.glFlush();
        angle += 3.0f;

		
	}

	@Override
	public void dispose(GLAutoDrawable arg0) {
		// TODO 自动生成的方法存根
		
	}

	@Override
	public void init(GLAutoDrawable drawable) {

		GL2 gl = drawable.getGL().getGL2();
        gl.glClearColor(0.392f, 0.584f, 0.929f, 1.0f);
		
	}

	@Override
	public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,
			int arg4) {
		// TODO 自动生成的方法存根
		
	}
	public static void main(String[] args) {

		Rectangle windowBounds=new Rectangle(100,100,600,600);
		
		// 获取GL2的所有特性
        final GLProfile proifile = GLProfile.get(GLProfile.GL2);
        GLCapabilities capabilities = new GLCapabilities(proifile);

        // 画布
        final GLCanvas glCanvas = new GLCanvas(capabilities);
        My3dConponent lightingPolygon = new My3dConponent();
        glCanvas.addGLEventListener(lightingPolygon);
        glCanvas.setSize(windowBounds.width, windowBounds.height);

        // 创建JFrame
        final JFrame frame = new JFrame("带光照效果的旋转多边形");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.setLayout(null);
         
        frame.getContentPane().add(glCanvas);
        frame.setBounds(windowBounds);

        frame.setVisible(true);

        // 设置动画
        final FPSAnimator animator = new FPSAnimator(glCanvas, 100, true);
        animator.start();
    }
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值