¿Cómo encontrar un vector normal que apunte directamente desde el mundo virtual a la pantalla en Java3D?

StackOverflow https://stackoverflow.com/questions/40028

  •  09-06-2019
  •  | 
  •  

Pregunta

Creo que se puede hacer aplicando la matriz de transformación del gráfico de escena a z-normal (0, 0, 1), pero no funciona.Mi código es el siguiente:

Vector3f toScreenVector = new Vector3f(0, 0, 1);
Transform3D t3d = new Transform3D();
tg.getTransform(t3d); //tg is Transform Group of all objects in a scene
t3d.transform(toScreenVector);

Luego probé algo como esto también:

Point3d eyePos = new Point3d();
Point3d mousePos = new Point3d();
canvas.getCenterEyeInImagePlate(eyePos);
canvas.getPixelLocationInImagePlate(new Point2d(Main.WIDTH/2, Main.HEIGHT/2), mousePos); //Main is the class for main window.

Transform3D motion = new Transform3D();
canvas.getImagePlateToVworld(motion);
motion.transform(eyePos);
motion.transform(mousePos);

Vector3d toScreenVector = new Vector3f(eyePos);
toScreenVector.sub(mousePos);
toScreenVector.normalize();

Pero aún así esto no funciona correctamente.Creo que debe haber una manera fácil de crear ese vector.¿Sabes cuál es el problema con mi código o una mejor manera de hacerlo?

¿Fue útil?

Solución 2

Sí, entendiste bien mi pregunta.Lamento haber estado un poco confundido ayer.Ahora he corregido el código siguiendo su sugerencia y mezclando dos fragmentos de código en la pregunta:

Vector3f toScreenVector = new Vector3f(0, 0, 1);

Transform3D t3d = new Transform3D();
canvas.getImagePlateToVworld(t3d);
t3d.transform(toScreenVector);

tg.getTransform(t3d); //tg is Transform Group of all objects in a scene
t3d.transform(toScreenVector);

Gracias.

Otros consejos

Si entiendo bien, ¿quieres un vector que sea normal al plano de la pantalla, pero en coordenadas mundiales?

En ese caso quieres INVERT la transformación de World -> Screen and do Screen -> World de (0,0,-1) o (0,0,1) dependiendo de a qué eje apunta la pantalla hacia abajo.

Dado que la matriz ModelView es solo una matriz de rotación (ignorando la parte de transformación homogénea), puede simplemente extraerla tomando la transposición de la parte rotacional, o simplemente leyendo en la fila inferior, ya que esto se transpone a la Z columna de coordenadas bajo transposición.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top