У меня есть объект наподобие HUD на передней части трубы в Three.js, однако этот Hud должен всегда выравнивать себя в зависимости от точки вектора.Эта векторная точка является верхней стороной этой точки, поэтому объект должен быть все время выровнен с этой точкой независимо от направления и положения трубки.Чтобы проиллюстрировать проблему, я прилагаю изображение.
https://imgur.com/a/QNtz25E
На изображении зеленая стрелка представляет трубу, красная линия представляет векторную точку, с которой изображение круга должно вращаться вокругось z, которая должна быть выровнена.
Я пытался вычислить угол векторной точки и ее центральной точки, чтобы вычислить, сколько мне нужно повернуть по оси z, чтобы выровнять ее по точке.который работает в некоторых сценариях, когда объект не перевернут, например.Чтобы разместить объект, я использую последнюю точку трубки и использую предыдущую точку зрения, чтобы держать ее всегда перпендикулярно.
rotateobject() {
//set the object perpendicular to the pipe
this.hudObj.lookAt(this.previouspoint);
let zerovector = new THREE.Euler();
//reset the rotation
this.hudObj.rotation.copy(zerovector);
this.hudObj.lookAt(this.previousActualPoint);
//Line to be able to see if the object is aligned
var material = new THREE.LineBasicMaterial({
color: 0x0000ff
});
var geometry = new THREE.Geometry();
geometry.vertices.push(
new THREE.Vector3( this.previouspoint.x , this.previouspoint.y, this.previouspoint.z),
new THREE.Vector3( ((this.previouspoint.x) + this.previouspointdata.highSide.x), ((this.previouspoint.y) + this.previouspointdata.highSide.y), ((this.previouspoint.z) + this.previouspointdata.highSide.z) ),
);
var line = new THREE.Line( geometry, material );
this.scene.add( line );
/// calculate angle and rotate in z axis
var angleRadians = Math.atan2(parseFloat(this.previouspointdata.highSide.y.toFixed(1)), parseFloat(this.previouspointdata.highSide.x.toFixed(1)));
if (angleRadians > 0 && angleRadians < Math.PI / 2) {
this.hudObj.rotateZ(-(Math.PI / 2 - angleRadians) );
}//0-90
else if (angleRadians < Math.PI && angleRadians > Math.PI / 2) {
this.hudObj.rotateZ((angleRadians - Math.PI / 2) );
}//90-180
else if (angleRadians > -Math.PI && angleRadians < -Math.PI / 2) {
this.hudObj.rotateZ((-Math.PI/2 + angleRadians) );
}//-180-90
else if (angleRadians < 0 && angleRadians > -Math.PI / 2) {
this.hudObj.rotateZ(-(Math.PI / 2 - angleRadians));
}//-0-90
else if (angleRadians === 0) {
} //0
else if (angleRadians === Math.PI || angleRadians === -Math.PI) {
this.hudObj.rotateZ(-(Math.PI / 2) );
}//180
else {
if(Math.sign(angleRadians) === -1){
this.hudObj.rotateZ( Math.PI );
}
}
}
Я действительно ценю помощь, которую я очень застрял в этом.спасибо всем за помощь