안녕하세요. 3D 로테이션에 대한 도움이 필요합니다. 나는 게임 개발을 많이하지 않고 학계에서 배운 것을 간신히 기억합니다. 나는 3d 세계 (Minecraft)에서 2 차원 이미지를 렌더링하고 플레이어의 목표 좌표를 이미지의 왼쪽 아래쪽에 맞 춥니 다.3d 변환 n00b는 오픈 소스 mod에 대한 도움이 필요합니다.
- XZ의 비행기는 가
- 이미지는 항상 90도에있을 것입니다
- Y 수직 이다 게임에서 걷기면 내가 이미지를 렌더링 할 때 문제가
각도입니다 가로로 보면 대부분 작동하지 않습니다. 때로는 수직적 인 경우도 있습니다. 내가 수직으로 렌더링 할 때, 그것은 아름답게 작동합니다. 나는 그 나쁜 수학을 확신합니다. 나는 재판을하고 대부분은 내 길을 비췄다. 피치와 요는 플레이어에 대한 시야각입니다. 이것은 내가 이미지 위치와 방향을 설정하는 데 사용하려고하는 것입니다.
이것은 오픈 소스 Minecraft 서버 플러그인 용입니다. 살펴 주시기 바랍니다 :
https://bukkit-modders.googlecode.com/svn/trunk/
을 또한,이 논리가 좀 더 매트릭스/벡터 부두를 사용하여 감소시킬 수있다 보면, 의견을 주시기 바랍니다.
private Matrix4d calculateOrientation(Player player) {
Matrix4d orientation = new Matrix4d();
orientation.setIdentity();
Location location = player.getLocation();
Matrix4d rotY = new Matrix4d();
rotY.setIdentity();
double yaw = Math.abs(location.getYaw());
yaw %= 360;
double baseAngle = 0;
int sign = (location.getYaw() < 0) ? -1 : 1;
if (yaw > (90 - 45) & yaw < (90 + 45)) {
baseAngle = 90;
} else if (yaw > (180 - 45) & yaw < (180 + 45)) {
baseAngle = 180;
} else if (yaw > (270 - 45) && yaw < (270 + 45)) {
baseAngle = 270;
}
// Alight the left edge with the targeted location
//I have no idea why this works.
if (sign > 0) {
baseAngle -= 180;
rotY.rotY(Math.toRadians(baseAngle));
} else {
baseAngle += 180;
rotY.rotY(Math.toRadians(baseAngle));
}
Matrix4d rotXZ = new Matrix4d();
rotXZ.setIdentity();
double rotX = 0;
double rotZ = 0;
if (location.getPitch() > 45) {
//Rendering Flat in the plane of XZ
//This block is pretty broken
if (baseAngle == 0) {
rotX = 90;
} else if (baseAngle == 90) {
rotZ = 90;
} else if (baseAngle == 180) {
} else if (baseAngle == 270) {
rotZ = -90;
}
}
rotXZ.rotX(Math.toRadians(rotX));
rotXZ.rotZ(Math.toRadians(rotZ));
orientation.mul(rotXZ);
orientation.mul(rotY);
return orientation;
}
}