亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? renderer.java

?? NeHe用java與OpenGL結合教程源碼
?? JAVA
字號:
package demos.nehe.lesson25;

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;

import java.io.*;
import java.util.StringTokenizer;

import demos.common.ResourceRetriever;

class Renderer implements GLEventListener {
    private static final int STEPS = 200;                          // Maximum Number Of Steps

    private float xrot,yrot,zrot;								// X, Y & Z Rotation
    private float xspeed,yspeed,zspeed;						// X, Y & Z Spin Speed
    private boolean increaseXspeed, decreaseXspeed;
    private boolean increaseYspeed, decreaseYspeed;
    private boolean increaseZspeed, decreaseZspeed;
    private float cx,cy,cz = -15;								// X, Y & Z Position
    private boolean moveObjectFarther, moveObjectCloser;
    private boolean moveObjectUp, moveObjectDown;
    private boolean moveObjectLeft, moveObjectRight;

    private int step = 0;							// Step Counter
    private boolean morph = false;								// Default morph To False (Not Morphing)

    private int maxver;										// Will Eventually Hold The Maximum Number Of Vertices
    private Object3D objects[] = new Object3D[4];				// Our 4 Morphable Objects (morph1,2,3 & 4)
    private final Object morphLock = new Object();
    private Object3D helper,sour,dest;							// Helper Object, Source Object, Destination Object

    private GLU glu = new GLU();

    public void morphTo(int morphTarget) {
        if (morphTarget < 1 || morphTarget > 4) {
            throw new IllegalArgumentException("Morph target must lie between 1 and " + objects.length);
        }
        synchronized (morphLock) {
            if (morph)
                return;
            morph = true;
            dest = objects[morphTarget - 1];
        }
    }

    public void increaseXspeed(boolean increaseXspeed) {
        this.increaseXspeed = increaseXspeed;
    }

    public void decreaseXspeed(boolean decreaseXspeed) {
        this.decreaseXspeed = decreaseXspeed;
    }

    public void increaseYspeed(boolean increaseYspeed) {
        this.increaseYspeed = increaseYspeed;
    }

    public void decreaseYspeed(boolean decreaseYspeed) {
        this.decreaseYspeed = decreaseYspeed;
    }

    public void increaseZspeed(boolean increaseZspeed) {
        this.increaseZspeed = increaseZspeed;
    }

    public void decreaseZspeed(boolean decreaseZspeed) {
        this.decreaseZspeed = decreaseZspeed;
    }

    public void moveObjectUp(boolean moveObjectUp) {
        this.moveObjectUp = moveObjectUp;
    }

    public void moveObjectDown(boolean moveObjectDown) {
        this.moveObjectDown = moveObjectDown;
    }

    public void moveObjectLeft(boolean moveObjectLeft) {
        this.moveObjectLeft = moveObjectLeft;
    }

    public void moveObjectRight(boolean moveObjectRight) {
        this.moveObjectRight = moveObjectRight;
    }

    public void moveObjectFarther(boolean moveObjectFarther) {
        this.moveObjectFarther = moveObjectFarther;
    }

    public void moveObjectCloser(boolean moveObjectCloser) {
        this.moveObjectCloser = moveObjectCloser;
    }

    private Object3D loadObject(InputStream inputStream) throws IOException {						// Loads Object From File (name)
        BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
        String oneline = in.readLine();
        StringTokenizer tokenizer = new StringTokenizer(oneline);
        tokenizer.nextToken(); // Vertices:
        int nbVertices = Integer.parseInt(tokenizer.nextToken()); // Scans Text For "Vertices: ".  Number After Is Stored In ver
        Object3D object = new Object3D(nbVertices);         // Sets Objects verts Variable To Equal The Value Of ver

        for (int i = 0; i < nbVertices; i++) {								// Loops Through The Vertices
            oneline = in.readLine();                 // Reads In The Next Line Of Text
            tokenizer = new StringTokenizer(oneline);// Searches For 3 Floating Point Numbers, Store In rx,ry & rz
            float rx = Float.parseFloat(tokenizer.nextToken());
            float ry = Float.parseFloat(tokenizer.nextToken());
            float rz = Float.parseFloat(tokenizer.nextToken());
            object.points[i] = new Vertex();
            object.points[i].x = rx;							// Sets Objects (k) points.x Value To rx
            object.points[i].y = ry;							// Sets Objects (k) points.y Value To ry
            object.points[i].z = rz;							// Sets Objects (k) points.z Value To rz
        }

        if (nbVertices > maxver) maxver = nbVertices;							// If ver Is Greater Than maxver Set maxver Equal To ver

        return object;
    }

    void calculate(int i, Vertex a) {								// Calculates Movement Of Points During Morphing
        a.x = (sour.points[i].x - dest.points[i].x) / STEPS;	// a.x Value Equals Source x - Destination x Divided By Steps
        a.y = (sour.points[i].y - dest.points[i].y) / STEPS;	// a.y Value Equals Source y - Destination y Divided By Steps
        a.z = (sour.points[i].z - dest.points[i].z) / STEPS;	// a.z Value Equals Source z - Destination z Divided By Steps
    }														// This Makes Points Move At A Speed So They All Get To Their
    // Destination At The Same Time

    public void init(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();

        gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);					// Set The Blending Function For Translucency
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);				// This Will Clear The Background Color To Black
        gl.glClearDepth(1.0);									// Enables Clearing Of The Depth Buffer
        gl.glDepthFunc(GL.GL_LESS);								// The Type Of Depth Test To Do
        gl.glEnable(GL.GL_DEPTH_TEST);							// Enables Depth Testing
        gl.glShadeModel(GL.GL_SMOOTH);							// Enables Smooth Color Shading
        gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);	// Really Nice Perspective Calculations

        maxver = 0;											// Sets Max Vertices To 0 By Default
        try {
            objects[0] = loadObject(ResourceRetriever.getResourceAsStream("demos/data/models/sphere.txt"));					// Load The First Object Into morph1 From File sphere.txt
            objects[1] = loadObject(ResourceRetriever.getResourceAsStream("demos/data/models/torus.txt"));					// Load The Second Object Into morph2 From File torus.txt
            objects[2] = loadObject(ResourceRetriever.getResourceAsStream("demos/data/models/tube.txt"));					// Load The Third Object Into morph3 From File tube.txt
            helper = loadObject(ResourceRetriever.getResourceAsStream("demos/data/models/sphere.txt"));// Load sphere.txt Object Into Helper (Used As Starting Point)
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        objects[3] = new Object3D(486);							// Manually Reserver Ram For A 4th 468 Vertice Object (morph4)
        for (int i = 0; i < 486; i++)								// Loop Through All 468 Vertices
        {
            objects[3].points[i] = new Vertex();
            objects[3].points[i].x = (float) (Math.random() - 0.5) * 7;	// morph4 x Point Becomes A Random Float Value From -7 to 7
            objects[3].points[i].y = (float) (Math.random() - 0.5) * 7;	// morph4 y Point Becomes A Random Float Value From -7 to 7
            objects[3].points[i].z = (float) (Math.random() - 0.5) * 7;	// morph4 z Point Becomes A Random Float Value From -7 to 7
        }

        sour = dest = objects[0];									// Source & Destination Are Set To Equal First Object (morph1)
    }

    public void display(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();

        drawGLScene(gl);
        update();
    }

    private void drawGLScene(GL gl) {
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);	// Clear The Screen And The Depth Buffer
        gl.glLoadIdentity();									// Reset The View
        gl.glTranslatef(cx, cy, cz);								// Translate The The Current Position To Start Drawing
        gl.glRotatef(xrot, 1, 0, 0);								// Rotate On The X Axis By xrot
        gl.glRotatef(yrot, 0, 1, 0);								// Rotate On The Y Axis By yrot
        gl.glRotatef(zrot, 0, 0, 1);								// Rotate On The Z Axis By zrot

        xrot += xspeed;
        yrot += yspeed;
        zrot += zspeed;			// Increase xrot,yrot & zrot by xspeed, yspeed & zspeed

        float tx,ty,tz;									// Temp X, Y & Z Variables
        Vertex q = new Vertex();											// Holds Returned Calculated Values For One Vertex

        gl.glBegin(GL.GL_POINTS);									// Begin Drawing Points
        for (int i = 0; i < maxver; i++) {				// Loop Through All The Verts
            if (morph)
                calculate(i, q);
            else
                q.x = q.y = q.z = 0;	// If morph Is True Calculate Movement Otherwise Movement=0
            helper.points[i].x -= q.x;					// Subtract q.x Units From helper.points[i].x (Move On X Axis)
            helper.points[i].y -= q.y;					// Subtract q.y Units From helper.points[i].y (Move On Y Axis)
            helper.points[i].z -= q.z;					// Subtract q.z Units From helper.points[i].z (Move On Z Axis)
            tx = helper.points[i].x;						// Make Temp X Variable Equal To Helper's X Variable
            ty = helper.points[i].y;						// Make Temp Y Variable Equal To Helper's Y Variable
            tz = helper.points[i].z;						// Make Temp Z Variable Equal To Helper's Z Variable

            gl.glColor3f(0, 1, 1);							// Set Color To A Bright Shade Of Off Blue
            gl.glVertex3f(tx, ty, tz);						// Draw A Point At The Current Temp Values (Vertex)
            gl.glColor3f(0, 0.5f, 1);						// Darken Color A Bit
            tx -= 2 * q.x;
            ty -= 2 * q.y;
            ty -= 2 * q.y;			// Calculate Two Positions Ahead
            gl.glVertex3f(tx, ty, tz);						// Draw A Second Point At The Newly Calculate Position
            gl.glColor3f(0, 0, 1);							// Set Color To A Very Dark Blue
            tx -= 2 * q.x;
            ty -= 2 * q.y;
            ty -= 2 * q.y;			// Calculate Two More Positions Ahead
            gl.glVertex3f(tx, ty, tz);						// Draw A Third Point At The Second New Position
        }												// This Creates A Ghostly Tail As Points Move
        gl.glEnd();											// Done Drawing Points

        // If We're Morphing And We Haven't Gone Through All 200 Steps Increase Our Step Counter
        // Otherwise Set Morphing To False, Make Source=Destination And Set The Step Counter Back To Zero.
        if (morph && step <= STEPS)
            step++;
        else {
            synchronized (morphLock) {
                morph = false;
                sour = dest;
                step = 0;
            }
        }
    }

    private void update() {
        if (increaseZspeed)								// Is Page Up Being Pressed?
            zspeed += 0.001f;								// Increase zspeed

        if (decreaseZspeed)								// Is Page Down Being Pressed?
            zspeed -= 0.001f;								// Decrease zspeed

        if (increaseXspeed)								// Is Page Up Being Pressed?
            xspeed += 0.001f;								// Increase xspeed

        if (decreaseXspeed)									// Is Page Up Being Pressed?
            xspeed -= 0.001f;								// Decrease xspeed

        if (increaseYspeed)								// Is Page Up Being Pressed?
            yspeed += 0.001f;								// Increase yspeed

        if (decreaseYspeed)								// Is Page Up Being Pressed?
            yspeed -= 0.001f;								// Decrease yspeed

        if (moveObjectFarther)									// Is Q Key Being Pressed?
            cz -= 0.01f;										// Move Object Away From Viewer

        if (moveObjectCloser)									// Is Z Key Being Pressed?
            cz += 0.01f;										// Move Object Towards Viewer

        if (moveObjectUp)									// Is W Key Being Pressed?
            cy += 0.01f;										// Move Object Up

        if (moveObjectDown)									// Is S Key Being Pressed?
            cy -= 0.01f;										// Move Object Down

        if (moveObjectRight)									// Is D Key Being Pressed?
            cx += 0.01f;										// Move Object Right

        if (moveObjectLeft)									// Is A Key Being Pressed?
            cx -= 0.01f;										// Move Object Left
    }

    public void reshape(GLAutoDrawable drawable,
                        int xstart,
                        int ystart,
                        int width,
                        int height) {
        GL gl = drawable.getGL();

        height = (height == 0) ? 1 : height;

        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();

        glu.gluPerspective(45, (float) width / height, 0.1, 100);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

    public void displayChanged(GLAutoDrawable drawable,
                               boolean modeChanged,
                               boolean deviceChanged) {
    }

    private static class Vertex {											// Structure For 3D Points
        public float x, y, z;									// X, Y & Z Points
    }

    private static class Object3D {
        public Vertex[] points;									// One Vertice (Vertex x,y & z)

        public Object3D(int nbPoints) {
            points = new Vertex[nbPoints];
        }
    }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
92国产精品观看| 国产婷婷一区二区| 久久久www成人免费毛片麻豆 | 国产精品久久福利| 丝袜诱惑亚洲看片| a级精品国产片在线观看| 3d动漫精品啪啪一区二区竹菊 | 欧美在线免费观看视频| 久久综合久久鬼色| 日日摸夜夜添夜夜添精品视频| www.爱久久.com| 久久久久久久综合狠狠综合| 午夜激情综合网| 精品国产人成亚洲区| 亚洲国产综合91精品麻豆| 成人免费毛片嘿嘿连载视频| 日韩视频一区二区| 视频一区国产视频| 欧美三级视频在线| 亚洲综合图片区| 91美女在线看| 一色桃子久久精品亚洲| 成人黄色小视频| 国产女人18毛片水真多成人如厕 | 欧美日韩mp4| 亚洲综合激情小说| 91免费视频网址| 亚洲色欲色欲www| 97久久精品人人做人人爽50路| 久久精品人人做| 国产成人综合网| 国产视频一区二区在线| 国产麻豆9l精品三级站| 久久亚洲精华国产精华液| 狠狠色狠狠色综合日日91app| 日韩精品一区二区三区中文精品 | 亚洲欧美色综合| 99精品久久只有精品| 亚洲人成7777| 在线影院国内精品| 亚洲福利一二三区| 在线播放中文字幕一区| 日产欧产美韩系列久久99| 欧美一区二区三区电影| 激情综合色综合久久综合| 久久综合视频网| 国产成人综合亚洲91猫咪| 国产精品日韩成人| 91福利社在线观看| 亚洲高清不卡在线| 亚洲精品一区二区三区蜜桃下载| 国产剧情一区二区三区| 亚洲图片欧美激情| 欧美麻豆精品久久久久久| 麻豆精品新av中文字幕| 国产欧美综合在线观看第十页 | 免费av网站大全久久| 欧美精品一区二区久久久 | 国内精品不卡在线| 中文字幕一区二区三区四区不卡 | 成人午夜在线视频| 一区二区三区在线观看视频 | 国产人伦精品一区二区| 91香蕉视频污在线| 日韩高清一区二区| 国产精品五月天| 欧美日韩五月天| 国产一区二区在线观看免费| 亚洲色图欧美激情| 欧美一区二区在线看| 成人a区在线观看| 喷白浆一区二区| 国产精品国产成人国产三级| 7777精品伊人久久久大香线蕉| 国产一区二区三区黄视频 | 亚洲色图一区二区三区| a4yy欧美一区二区三区| 五月婷婷欧美视频| 欧美激情中文不卡| 欧美日韩一区久久| youjizz国产精品| 极品销魂美女一区二区三区| 亚洲精品成人精品456| 26uuu亚洲婷婷狠狠天堂| 欧美影院一区二区三区| 高清在线不卡av| 人人精品人人爱| 一区2区3区在线看| 国产精品天干天干在线综合| 欧美一区二区三区日韩视频| 色婷婷国产精品久久包臀 | 成人教育av在线| 天天av天天翘天天综合网 | 日韩不卡在线观看日韩不卡视频| 日本一区二区三区在线观看| 欧美一区二视频| 欧美日韩综合在线| 91蝌蚪porny成人天涯| 国产精品一区专区| 免费成人在线网站| 午夜欧美2019年伦理| 亚洲精品乱码久久久久久| 国产欧美综合在线观看第十页| 日韩久久免费av| 欧美日韩精品专区| 欧美视频日韩视频在线观看| 色妞www精品视频| 99久久伊人久久99| 成人精品视频.| 成人激情午夜影院| 国产白丝网站精品污在线入口 | 亚洲综合在线观看视频| 日韩一区日韩二区| 国产精品久久久久久久久久免费看 | 精品一区二区av| 久久不见久久见免费视频7| 美洲天堂一区二卡三卡四卡视频 | 亚洲男人天堂一区| 亚洲欧美韩国综合色| 一区二区三区在线观看视频| 亚洲精品美腿丝袜| 亚洲国产三级在线| 天天色综合成人网| 另类小说图片综合网| 精品影视av免费| 国产精品99久久久久久宅男| 成人夜色视频网站在线观看| 成人亚洲精品久久久久软件| 99久久777色| 欧美在线一区二区| 日韩亚洲欧美在线| 亚洲精品一区二区三区蜜桃下载| 国产三级三级三级精品8ⅰ区| 国产欧美视频在线观看| 亚洲视频在线一区二区| 亚洲一区二区黄色| 青青草国产成人99久久| 国产精品亚洲第一区在线暖暖韩国| 成人深夜在线观看| 欧美在线三级电影| 欧美成人乱码一区二区三区| 日本一区二区免费在线| 一区二区三区中文在线| 日本成人中文字幕| 成人午夜短视频| 欧美剧情片在线观看| 国产亚洲婷婷免费| 亚洲综合一二三区| 精品一区二区三区久久| 91视频91自| 欧美mv日韩mv国产网站| 中文字幕日韩av资源站| 日本女优在线视频一区二区| 国产精品一级在线| 欧美日韩国产免费一区二区| 久久影院午夜论| 亚洲一区二区中文在线| 国产精品一级片| 欧美色图激情小说| 国产三区在线成人av| 香蕉成人啪国产精品视频综合网| 国产呦精品一区二区三区网站 | 成人av免费在线观看| 欧美精品日韩综合在线| 国产精品福利一区二区| 日韩不卡在线观看日韩不卡视频| 成人的网站免费观看| 日韩美女在线视频| 亚洲一卡二卡三卡四卡五卡| 国产成a人无v码亚洲福利| 欧美色欧美亚洲另类二区| 国产精品传媒在线| 国内精品久久久久影院色| 欧美日韩激情一区二区三区| 中文字幕佐山爱一区二区免费| 老司机精品视频线观看86 | 精品日韩一区二区| 亚洲成人免费观看| 一本一道久久a久久精品 | 日韩一二三区不卡| 一区二区三区欧美激情| 99这里只有精品| 久久久一区二区三区| 美女网站一区二区| 88在线观看91蜜桃国自产| 亚洲精品你懂的| 91论坛在线播放| 亚洲天堂精品在线观看| 国产99久久久国产精品| 欧美精品一区二区高清在线观看| 亚洲aⅴ怡春院| 欧美视频一区二| 午夜影视日本亚洲欧洲精品| 色域天天综合网| 亚洲精品福利视频网站| 91在线丨porny丨国产| 亚洲欧洲无码一区二区三区| 国产精品66部| 久久久久久电影| 国产精品影视网|