Skip to content

Latest commit

 

History

History
186 lines (141 loc) · 3.9 KB

19.添加平移变换.md

File metadata and controls

186 lines (141 loc) · 3.9 KB

GameEngine Java 3D V2.0

19.添加平移变换

我们已经为平面渲染上颜色了 接下来为引擎加入一些变换 平移旋转缩放

这里就需要用到我们的四维矩阵了

添加Transorm前要添加好矩阵平移与旋转运算的初始化 下面是变换的基本公式

平移

cmd-markdown-logo

cmd-markdown-logo

旋转

cmd-markdown-logo

缩放

cmd-markdown-logo

先为四维矩阵类加入平移运算公式

    /*
    * 四维矩阵平移变换
    * */
    public Matrix4f initTranslation(float x, float y, float z)
    {
        m[0][0] = 1;	m[0][1] = 0;	m[0][2] = 0;	m[0][3] = x;
        m[1][0] = 0;	m[1][1] = 1;	m[1][2] = 0;	m[1][3] = y;
        m[2][0] = 0;	m[2][1] = 0;	m[2][2] = 1;	m[2][3] = z;
        m[3][0] = 0;	m[3][1] = 0;	m[3][2] = 0;	m[3][3] = 1;

        return this;
    }

创建变换类

public class Transform {

    /*
    * 平移
    * */
    private Vector3f translation;
    /*
    * 构造函数
    * */
    public Transform() {
        translation = new Vector3f(0,0,0);
    }
    /*
    * 获得变换矩阵
    * */
    public Matrix4f getTransformation()
    {
        Matrix4f translationMatrix = new Matrix4f().initTranslation(translation.getX(), translation.getY(), translation.getZ());

        return translationMatrix;
    }

    public Vector3f getTranslation() {
        return translation;
    }
    public void setTranslation(Vector3f translation) {
        this.translation = translation;
    }

    public void setTranslation(float x, float y, float z)
    {
        this.translation = new Vector3f(x, y, z);
    }

    
}

在Game里给平面加入变换

public class Game implements CyberGame {


    private Mesh mesh;
    private Shader shader;
    private Transform transform;
    /*
     * 构造函数
     * */

    public Game() {
        //新建网格类
        mesh = new Mesh();
        shader = new Shader();
        transform = new Transform();
        //添加点
        Vertex[] data = new Vertex[] { new Vertex(new Vector3f(-1, -1, 0)), new Vertex(new Vector3f(0, 1, 0)),
                new Vertex(new Vector3f(1, -1, 0)) };

        mesh.addVertices(data);

        /*
        * 为网格类加上材质
        * */

//        shader.addVertexShader(ResourceLoader.loadShader("UniformVertex.vs"));
        shader.addVertexShader(ResourceLoader.loadShader("TransformVertex.vs"));
        shader.addFragmentShader(ResourceLoader.loadShader("UniformFragment.fs"));
        shader.compileShader();

        /*
        * 添加均匀的处理方法
        * */
//        shader.addUniform("uniformFloat");

        /*
        * 添加变化的处理方法
        * */
        shader.addUniform("transform");


    }

    /*
     * 开始
     * */
    public void start() {
    }

    /*
    * 输入事件
    * */

    public void input(){
        if(Input.getKeyDown(Input.KEY_UP))
            System.out.println("Up键已经被按下");
        if (Input.getKeyUp(Input.KEY_UP)){
            System.out.println("Up建已经被抬起");
        }
        if(Input.getMouseDown(1)) {
            System.out.println("右键被按下");
        }
        if(Input.getMouseUp(1)){
            System.out.println("右键被抬起");
        }
    }

    float temp = 0.0f;
    /*
     * 更新
     * */
    public void update() {
        temp += Time.getDelta();
        /*
        * 均匀化 颜色变化
        * */
//        shader.setUniformf("uniformFloat", (float)Math.abs(Math.sin(temp)));
        /*
        * 均匀化 物理变化
        * */
        transform.setTranslation((float)Math.sin(temp), 0, 0);
        shader.setUniform("transform", transform.getTransformation());
    }

    /*
     * 渲染
     * */
    public void render() {
        shader.bind();
        mesh.draw();

    }

}

效果如下: