当前位置: 代码迷 >> 综合 >> [Java] [OpenGL ES3.2] Camera2.0
  详细解决方案

[Java] [OpenGL ES3.2] Camera2.0

热度:85   发布时间:2023-11-27 16:55:47.0

代码

Camera.java

package com.Diamond.gl07;import android.opengl.Matrix;
import android.renderscript.Matrix4f;
import android.renderscript.Float3;public class Camera {
    private Float3 mPosition;private Float3 mCenter;private Float3 mUp;private Matrix4f mProjection;private float mYaw;private float mPitch;private float mRoll;private float mFovy;private float mAspect;private float mNear;private float mFar;public final static Float3 XY = new Float3(1,1,0);public final static Float3 XZ = new Float3(1,0,1);public final static Float3 YZ = new Float3(0,1,1);public Camera(Float3 position,Float3 center,Float3 up) {
    mPosition = position;mCenter = center;mUp = up;mProjection = new Matrix4f();mYaw = 0;mPitch = 0;mRoll = 0;mFovy = 120;mAspect = 1;mNear = 1;mFar = 100;}public Camera setPosition(Float3 position) {
    mPosition = position;return this;}public Float3 getPosition() {
    return mPosition;}public Camera move(Float3 distance) {
    mPosition.x += distance.x;mPosition.y += distance.y;mPosition.z += distance.z;return this;}public Camera moveX(float distance) {
    mPosition.x += distance;return this;}public Camera setX(float x) {
    mPosition.x = x;return this;}public Camera moveY(float distance) {
    mPosition.y += distance;return this;}public Camera setY(float y) {
    mPosition.y = y;return this;}public Camera moveZ(float distance) {
    mPosition.z += distance;return this;}public Camera setZ(float z) {
    mPosition.z = z;return this;}public Camera setCenter(Float3 center) {
    mCenter = center;return this;}public Camera setUp(Float3 up) {
    mUp = up;return this;}public Camera setPerspective(float fovy,float aspect,float near,float far) {
    mFovy = fovy;mAspect = aspect;mNear = near;mFar = far;updatePerspective();return this;}public Camera updatePerspective() {
    mProjection.loadIdentity();mProjection.loadPerspective(mFovy,mAspect,mNear,mFar);return this;}public Camera setFovy(float fovy) {
    mFovy = fovy;updatePerspective();return this;}public float getFovy() {
    return mFovy;}public Camera fovy(float angle) {
    mFovy += angle;updatePerspective();return this;}public Camera setAspect(float aspect) {
    mAspect = aspect;updatePerspective();return this;}public float getAspect() {
    return mAspect;}public Camera setNear(float near) {
    mNear = near;updatePerspective();return this;}public float getNear() {
    return mNear;}public Camera setFar(float far) {
    mFar = far;updatePerspective();return this;}public float getFar() {
    return mFar;}public Camera setOrtho(float l,float r,float b,float t,float n,float f) {
    mProjection.loadOrtho(l,r,b,t,n,f);return this;}public float[] getProjectionMatrix() {
    return mProjection.getArray();}public float[] getViewMatrix() {
    float[] view = new float[16];Matrix.setLookAtM(view,0,mPosition.x,mPosition.y,mPosition.z,mCenter.x,mCenter.y,mCenter.z,mUp.x,mUp.y,mUp.z);return view;}//这个函数有问题,明明和LearnOpenGL的一样,但是就是有问题public Camera updatePose() {
    if(mYaw >= 360) {
    mYaw -= 360;} else if(mYaw < 0) {
    mYaw += 360;}if(mPitch >= 90) {
    mPitch = 89.9f;} else if(mPitch <= -90) {
    mPitch = -89.9f;}if(mRoll >= 360) {
    mRoll -= 360;} else if(mRoll < 0) {
    mRoll += 360;}float x = (float)Math.cos(Math.toRadians(mYaw)) * (float)Math.cos(Math.toRadians(mPitch));float y = (float)Math.sin(Math.toRadians(mPitch));float z = (float)Math.sin(Math.toRadians(mYaw)) * (float)Math.cos(Math.toRadians(mPitch));//标准化,相当于normalize()float mod = (float)Math.sqrt(x * x + y * y + z * z);x /= mod;y /= mod;z /= mod;mCenter = new Float3(x,y,z);//roll的计算其实有问题,默认是朝向Z轴负半轴的float rx = (float)Math.sin(Math.toRadians(mRoll));float ry = (float)Math.cos(Math.toRadians(mRoll));mUp = new Float3(rx,ry,0);return this;}public Camera setOrbit(Float3 plane,float angle,float distance) {
    float x = (float)Math.sin(Math.toRadians(angle)) * distance;float y = (float)Math.cos(Math.toRadians(angle)) * distance;boolean isFirst = true;if(plane.x == 1) {
    mPosition.x = x;isFirst = false;}if(plane.y == 1) {
    if(isFirst) {
    mPosition.y = x;mPosition.z = y;} else {
    mPosition.y = y;}}if(plane.z == 1) {
    mPosition.z = y;}return this;}public Camera setYaw(float yaw) {
    mYaw = yaw;updatePose();return this;}public float getYaw() {
    return mYaw;}public Camera yaw(float angle) {
    mYaw += angle;updatePose();return this;}public Camera setPitch(float pitch) {
    mPitch = pitch;updatePose();return this;}public float getPitch() {
    return mPitch;}public Camera pitch(float angle) {
    mPitch += angle;updatePose();return this;}public Camera setRoll(float roll) {
    mRoll = roll;updatePose();return this;}public float getRoll() {
    return mRoll;}public Camera roll(float angle) {
    mRoll += angle;updatePose();return this;}
}

更新内容

增加了缩放(通过调整fovy)和环绕(绕着一个点让摄像机环绕)
分别对应setFovy(float),fovy(float)以及setOrbit(Float3,float,float)函数

提示

在看setOrbit()之前建议先了解三角函数和[Java] [OpenGL ES3.2] 正多边形,其实是差不多的

  相关解决方案