13 private float[] M =
new float[16];
23 public Camera(
float px,
float py,
float pz,
float vx,
float vy,
float vz,
float ux,
float uy,
float uz) {
24 Position =
new float[] { px, py, pz };
25 Center =
new float[] { vx, vy, vz };
26 Up =
new float[] { ux, uy, uz };
41 private void cal_M() {
44 f = NormVec(MinusVec(
Center, Position));
45 s = CrossVec(f, NormVec(
Up));
67 private float[] CrossVec(
float[] A,
float[] B) {
68 float[] C =
new float[3];
69 C[0] = A[1] * B[2] - A[2] * B[1];
70 C[1] = A[2] * B[0] - A[0] * B[2];
71 C[2] = A[0] * B[1] - A[1] * B[0];
76 private float[] MinusVec(
float[] A,
float[] B) {
77 float[] C =
new float[3];
85 private float[] MultQuat(
float[] A,
float[] B) {
86 float[] C =
new float[4];
87 C[0] = A[3] * B[0] + A[0] * B[3] + A[1] * B[2] - A[2] * B[1];
88 C[1] = A[3] * B[1] - A[0] * B[2] + A[1] * B[3] + A[2] * B[0];
89 C[2] = A[3] * B[2] + A[0] * B[1] - A[1] * B[0] + A[2] * B[3];
90 C[3] = A[3] * B[3] - A[0] * B[0] - A[1] * B[1] - A[2] * B[2];
95 private float[] NormVec(
float[] A) {
96 float[] C =
new float[3];
97 float length = (float) Math.sqrt(A[0] * A[0] + A[1] * A[1] + A[2] * A[2]);
100 C[2] = A[2] / length;
106 private void RotateCamera(
float angle,
float x,
float y,
float z) {
107 float[] temp =
new float[4];
108 float[] conjtemp =
new float[4];
109 float[] quat_view =
new float[4];
110 float[] result =
new float[4];
112 float deg = (float) ((angle / 180f) * Math.PI);
113 float sinhtheta = (float) Math.sin(deg / 2f);
114 temp[0] = x * sinhtheta;
115 temp[1] = y * sinhtheta;
116 temp[2] = z * sinhtheta;
117 temp[3] = (float) Math.cos(deg / 2f);
119 conjtemp[0] = -temp[0];
120 conjtemp[1] = -temp[1];
121 conjtemp[2] = -temp[2];
122 conjtemp[3] = temp[3];
124 quat_view[0] =
View[0];
125 quat_view[1] =
View[1];
126 quat_view[2] =
View[2];
129 result = MultQuat(MultQuat(temp, quat_view), conjtemp);
141 RotateCamera(rot1,
Up[0],
Up[1],
Up[2]);
Camera(float px, float py, float pz, float vx, float vy, float vz, float ux, float uy, float uz)
float[] getRotationMatrix()
Extracted the Camera class from GLRenderer.
void SetRotation(float rot1, float rot2)