我们已经为平面渲染上颜色了 接下来为引擎加入一些变换 平移旋转缩放
这里就需要用到我们的四维矩阵了
添加Transorm前要添加好矩阵平移与旋转运算的初始化 下面是变换的基本公式
先为四维矩阵类加入平移运算公式
/*
* 四维矩阵平移变换
* */
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();
}
}
效果如下: