void SE_Camera::rotateLocal(const SE_Quat& rotate) { SE_Vector3f localxAxis(1, 0, 0); SE_Vector3f localyAxis(0, 1, 0); SE_Vector3f localzAxis(0, 0, 1); localxAxis = rotate.map(localxAxis); localyAxis = rotate.map(localyAxis); //localzAxis = rotate.map(zAxis); SE_Matrix4f vtom = getViewToWorldMatrix(); SE_Vector4f worldxAxis = vtom.map(SE_Vector4f(localxAxis, 0)); SE_Vector4f worldyAxis = vtom.map(SE_Vector4f(localyAxis, 0)); //SE_Vector4f worldzAxis = vtom.map(SE_Vector4f(localzAxis, 0)); SE_Vector4f worldzAxis(worldxAxis.xyz().cross(worldyAxis.xyz()), 0); mAxisX = worldxAxis.normalize().xyz(); mAxisY = worldyAxis.normalize().xyz(); mAxisZ = worldzAxis.normalize().xyz(); mChanged = true; }
void SE_GeometryData::transform(SE_GeometryData* src, const SE_Vector3f& scale, const SE_Quat& rotate, const SE_Vector3f& translate, SE_GeometryData* dst) { SE_Vector3f* vertex = NULL; SE_Vector3i* faces = NULL; SE_Vector3f*facenormal = NULL; SE_Vector3f* facevertexnormal = NULL; int vertexNum = 0; int faceNum = 0; int normalNum = 0; int facevertexnormalNum = 0; if(src->vertexArray) { vertex = new SE_Vector3f[src->vertexNum]; for(int i = 0 ; i < src->vertexNum ; i++) { SE_Vector3f v = scale.mul(src->vertexArray[i]); v = rotate.map(v); v = v + translate; vertex[i] = v; } vertexNum = src->vertexNum; } /* if(src->faceArray) { faces = new SE_Vector3i[src->faceNum]; for(int i = 0 ; i < src->faceNum; i++) { faces[i] = src->faceArray[i]; } faceNum = src->faceNum; } */ if(src->faceNormalArray) { SE_Matrix3f t; t.setScale(scale.x, scale.y, scale.z); SE_Matrix3f m; m = rotate.toMatrix3f(); m = m.mul(t); if(m.hasInverse()) { SE_Matrix3f inverse = m.inverse(); m = m.transpose(); facenormal = new SE_Vector3f[src->faceNormalNum]; for(int i = 0 ; i < src->faceNormalNum ; i++) { facenormal[i] = m.map(src->faceNormalArray[i]); } normalNum = src->faceNormalNum; } } if(src->faceVertexNormalArray) { SE_Matrix3f t; t.setScale(scale.x, scale.y, scale.z); SE_Matrix3f m; m = rotate.toMatrix3f(); m = m.mul(t); if(m.hasInverse()) { SE_Matrix3f inverse = m.inverse(); m = m.transpose(); facevertexnormal = new SE_Vector3f[src->faceVertexNormalNum]; for(int i = 0 ; i < src->faceVertexNormalNum ; i++) { facevertexnormal[i] = m.map(src->faceVertexNormalArray[i]); } facevertexnormalNum = src->faceVertexNormalNum; } } dst->setVertexArray(vertex, vertexNum); dst->setFaceArray(src->faceArray, src->faceNum, false); dst->setFaceNormalArray(facenormal, normalNum); dst->setFaceVertexNormalArray(facevertexnormal,facevertexnormalNum); }