OpenGL에서 피벗 위치를 고려하면서 Quaternion을 사용하여 행렬 회전을 수행하는 방법을 알아낼 수 없습니다. 현재 내가 얻는 것은 공간의 일부 지점을 중심으로 한 개체 회전입니다. 내가 원하는대로 로컬 피벗.쿼터니언 기반 회전 및 피벗 위치
public void rotateTo3(float xr, float yr, float zr) {
_rotation.x = xr;
_rotation.y = yr;
_rotation.z = zr;
Quaternion xrotQ = Glm.angleAxis((xr), Vec3.X_AXIS);
Quaternion yrotQ = Glm.angleAxis((yr), Vec3.Y_AXIS);
Quaternion zrotQ = Glm.angleAxis((zr), Vec3.Z_AXIS);
xrotQ = Glm.normalize(xrotQ);
yrotQ = Glm.normalize(yrotQ);
zrotQ = Glm.normalize(zrotQ);
Quaternion acumQuat;
acumQuat = Quaternion.mul(xrotQ, yrotQ);
acumQuat = Quaternion.mul(acumQuat, zrotQ);
Mat4 rotMat = Glm.matCast(acumQuat);
_model = new Mat4(1);
scaleTo(_scaleX, _scaleY, _scaleZ);
_model = Glm.translate(_model, new Vec3(_pivot.x, _pivot.y, 0));
_model =rotMat.mul(_model);//_model.mul(rotMat); //rotMat.mul(_model);
_model = Glm.translate(_model, new Vec3(-_pivot.x, -_pivot.y, 0));
translateTo(_x, _y, _z);
notifyTranformChange();
}
모델 매트릭스 스케일 방법 : 공개 공극이 scaleTo (플로트 X, Z 플로트, Y 플로트) {
_model.set(0, x);
_model.set(5, y);
_model.set(10, z);
_scaleX = x;
_scaleY = y;
_scaleZ = z;
notifyTranformChange();
}
여기 코드 [사용한 Java]
쿼터니언 회전 방법
번역 방법 : public void translateTo (float x, float y, float z) {
_x = x - _pivot.x;
_y = y - _pivot.y;
_z = z;
_position.x = _x;
_position.y = _y;
_position.z = _z;
_model.set(12, _x);
_model.set(13, _y);
_model.set(14, _z);
notifyTranformChange();
}
하지만 사원 수를 사용하지 않는 한이 방법은 잘 작동 :
는public void rotate(Vec3 axis, float angleDegr) {
_rotation.add(axis.scale(angleDegr));
// change to GLM:
Mat4 backTr = new Mat4(1.0f);
backTr = Glm.translate(backTr, new Vec3(_pivot.x, _pivot.y, 0));
backTr = Glm.rotate(backTr, angleDegr, axis);
backTr = Glm.translate(backTr, new Vec3(-_pivot.x, -_pivot.y, 0));
_model =_model.mul(backTr);///backTr.mul(_model);
notifyTranformChange();
}
나는 쿼터니온이 무엇인지 압니다. 또한 고정 파이프 라인을 사용하지 않습니다 :) –
그러나 첫 번째 제안은 문제를 해결합니다. 내가 말했던 것처럼 변환 행렬을 계산하거나 각각의 모든 정점에 쿼터니온과 변환을 적용합니다. – rioki