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);
}
Foi útil?

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 NodeS.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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top