こんにちは。3D 回転について助けが必要です。私はあまりゲーム開発を行っておらず、大学で学んだことをほとんど覚えていません。私は 3D ワールド (Minecraft) で 2D 画像をレンダリングしており、プレイヤーのターゲット座標を画像の左下に揃えています。
- XZ の平面は、ゲーム内の歩行可能な表面です
- Y は垂直
- 画像は常に 90 度の角度になります
問題は、画像を水平にレンダリングしようとすると、ほとんど機能しないことです。横の時もあれば縦の時もある。垂直にレンダリングすると、美しく機能します。私はその悪い数学を確信しています。私はこれのほとんどを試行錯誤しました。ピッチとヨーは、プレーヤーに対する視野角です。これは、画像の位置と向きを設定するために使用しようとしているものです。
これは、オープン ソースの 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;
}
}