Por que 3 objetos Xform no exemplo de molécula 3D JavaFX
Pergunta
Eu tenho uma pergunta relacionada ao MoleculeSampleApp na documentação da Oracle.Na função buildCamera()
eles criam três objetos do tipo Xform
e adicionalmente adicione a câmera ao terceiro.Por que preciso desses três objetos Xform aninhados?Desde já, obrigado!
private void buildCamera() {
root.getChildren().add(cameraXform);
cameraXform.getChildren().add(cameraXform2);
cameraXform2.getChildren().add(cameraXform3);
cameraXform3.getChildren().add(camera);
cameraXform3.setRotateZ(180.0);
camera.setNearClip(0.1);
camera.setFarClip(10000.0);
camera.setTranslateZ(-cameraDistance);
cameraXform.ry.setAngle(320.0);
cameraXform.rx.setAngle(40);
}
Solução
Admito que tenho lutado com o aparente vácuo de recursos 3D do JavaFX e com a falta de meticulosidade nos poucos recursos que encontrei.No entanto, cheguei a um palpite satisfatório.
As transformações são divididas e aninhadas para que sejam executadas em ordem.
Especificamente, cada Node
(e cada classe com a qual você trabalha é uma subclasse de Node
) tem sua própria lista de transformações.O Group
class é uma subclasse especial de Node
projetado, até onde eu sei, para ser um contêiner geral de outros JavaFX Node
S.O Documentação Oracle para Group
diz:
Qualquer transformação, efeito ou estado aplicado a um Grupo será aplicado a todos os filhos desse grupo.
Como resultado, uma instância de XForm
(a Group
subclasse que agrupa todas as transformações possíveis) dentro de outra XForm
aplicará a transformação externa e depois a transformação interna a qualquer coisa interna.
Neste caso as transformações não são nomeadas muito bem, mas cameraXform
é usado exclusivamente para rotação x/y, cameraXform2
é usado exclusivamente para tradução x/y, e cameraXform3
é usado exclusivamente para rotação z*.A ordem (e por extensão, o aninhamento) é importante porque as rotações são realizadas em torno dos eixos;traduzir primeiro fará com que a cena reaja de maneira não intuitiva à entrada do usuário.
*A rotação z (que é definida exatamente uma vez no aplicativo de exemplo), até onde eu sei, é usada para que o eixo y seja apontado para cima em vez do padrão JavaFX de y para baixo.Isso permite que as formas sejam adicionadas na orientação do eixo x/y/z comumente aceita, ao mesmo tempo que permite que sejam renderizadas na própria orientação do JavaFX.
Outras dicas
Eu acredito que é assim que eles foram capazes de tornar suaves transformações "precisas" sem expor a transformação afunda (que tem muito mais relevância em 3D).