オブジェクトをその方向に基づいて移動したい。 オブジェクトには、平行移動ベクトルと回転ベクトル(度)があります。 私はメソッドの移動を呼び出すことができますし、方向とオブジェクトを移動する必要があります(スピードを望む場合)。このメソッドに、オブジェクトが現在向いている方向に移動するよりも「進む」方向を与えるとします。LWJGL3独自の回転に基づいてエンティティを移動する
私は現在、このコードを持っている:
/*
* MIT License
*
* Copyright (c) 2017 Ralph Niemitz
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package de.ralleytn.engine.lunatic;
import javax.vecmath.Vector3f;
/**
* Merges rotation with translation and adds translation based on rotation.
* @author Ralph Niemitz/RalleYTN([email protected])
* @version 1.0.0
* @since 1.0.0
*/
public interface Movable extends Translatable, Rotatable {
/**
* Moves the object into the given direction based on its own rotation.
* @param direction the direction in which the object should be moved
* @param units the number of units it should be moved
* @since 1.0.0
*/
public default void move(Direction direction, float units) {
float nUnits = -units;
Vector3f rotation = this.getRotation();
if(direction == Direction.LEFT) {
float rY = (float)Math.toRadians(rotation.y);
float rZ = (float)Math.toRadians(rotation.z);
float x = (float)Math.cos(rY) * nUnits;
float y = (float)Math.sin(rZ) * units;
float z = (float)Math.sin(rY) * nUnits;
this.translate(x, y, z);
} else if(direction == Direction.RIGHT) {
// float rX = (float)Math.toRadians(rotation.x);
float rY = (float)Math.toRadians(rotation.y);
float rZ = (float)Math.toRadians(rotation.z);
float x = (float)Math.cos(rY) * units;
float y = (float)Math.sin(rZ) * nUnits;
float z = (float)Math.sin(rY) * units;
this.translate(x, y, z);
} else if(direction == Direction.FORWARD) {
float rX = (float)Math.toRadians(rotation.x);
float rY = (float)Math.toRadians(rotation.y - 90.0F);
float x = (float)Math.cos(rY) * units;
float y = (float)Math.sin(rX) * nUnits;
float z = (float)Math.sin(rY) * units;
this.translate(x, y, z);
} else if(direction == Direction.BACKWARD) {
float rX = (float)Math.toRadians(rotation.x);
float rY = (float)Math.toRadians(rotation.y - 90.0F);
float x = (float)Math.cos(rY) * nUnits;
float y = (float)Math.sin(rX) * units;
float z = (float)Math.sin(rY) * nUnits;
this.translate(x, y, z);
} else if(direction == Direction.UP) {
float rX = (float)Math.toRadians(rotation.x);
float rZ = (float)Math.toRadians(rotation.z);
float x = (float)Math.sin(rZ) * nUnits;
float y = (float)Math.cos(rX) * units;
float z = (float)Math.sin(rX) * nUnits;
this.translate(x, y, z);
} else if(direction == Direction.DOWN) {
float rX = (float)Math.toRadians(rotation.x);
float rZ = (float)Math.toRadians(rotation.z);
float x = (float)Math.sin(rZ) * units;
float y = (float)Math.cos(rX) * nUnits;
float z = (float)Math.sin(rX) * units;
this.translate(x, y, z);
}
}
}
それは本当に私はそれがしたいどのように動作しません。 私はかなり3Dの新しいので、あまり知識がありません。 これまで私が見てきた解決策は、UnityとC#のためのもので、本当に助けにはなりません。
重要な場合は、javax.vecmathパッケージを使用しています。
そこでは特に最後の3つのリンク(https://stackoverflow.com/a/28084380/2521214)[理解4x4の均質な変換行列]を参照してください... – Spektre