Panda3D/Manual/Mudanças de estado comuns
Sumário
[editar | editar código-fonte]Esta página lista algumas das mudanças mais comuns que você pode fazer em um nó 3D.
Mudança de estado
[editar | editar código-fonte]Duas das mudanças mais comuns são posição e orientação.
meuNodePath.setPos(X,Y,Z)
Por padrão, no Panda, o eixo X aponta pra direita, o Y para o fundo, e o Z para cima. A rotação de um objeto é normalmente descrita usando ângulos de euler chamados Heading, Pitch, e Roll(algumas vezes chamados de Yaw, Pitch, e Roll)--eles especificam as rotações de ângulo em graus.
Você pode mudar o tamanho de um objeto, uniformemente, ou especificando um valor diferente para X, Y e Z.
myNodePath.setScale(valor)
Algumas vezes é conveniente ajustar um único componente individualmente:
meuObjeto.setX(x) meuObjeto.setY(y) meuObjeto.setZ(z) meuObjeto.setH(h) meuObjeto.setP(p) meuObjeto.setR(r) meuObjeto.setSx(x) meuObjeto.setSy(y) meuObjeto.setSz(z)
Ou todos ao mesmo tempo:
meuObjeto.setPosHprScale(X,Y,Z,H,P,R,SX,SY,SZ)
Você também pode pegar a informação atual da transformação com os códigos abaixo:
meuObjeto.getPos() meuObjeto.getX() meuObjeto.getY() meuObjeto.getZ()
Ao usar as funções setTag() e getTag() você também pode armazenar suas próprias informações.
meuObject.setTag('Chave', 'Valor')
Você também pode configurar ou consultar a posição(ou qualquer uma das propriedades de transformação citadas acima) de um NodePath particular com respeito a outro objeto. Para fazer isso, especifique o NodePath relativo como primeiro parametro:
meuObjeto.setPos(outroObjeto, X, Y, Z) meuObjeto.getPos(outroObjeto)
Colocar um NodePath como primeiro parâmetro em qualquer uma das transformações set ou get faz delas uma operação relativa. O setPos() acima coloca o meuObjeto na posição (X, Y, Z), relativo ao outroObjeto-- isto é, a posição do meuObjeto estaria dentro do espaço do outroObjeto como se ele fosse um filho e sua posição estaria em (X, Y, Z). A função getPos() retorna a posição que o meuObjeto teria se ele fosse filho do outroObjeto.
Também é importante notar que você pode usar o próprio objeto nas funções relativas set e get. Por exemplo:
meuObjeto.setPos(meuObjeto, 3, 0, 0)
As funções set e get são características poderosas da SceneGraph, mas elas podem ser confusas ao mesmo tempo, não se preocupe se elas não fazem sentido algum agora
O método lookAt() gira um modelo de frente para outro objeto; isto é, ele gira o primeiro objeto de modo que o seu eixo Y aponte em direção ao segundo objeto
meuObjeto.lookAt(outroObjeto)
Mudança de core também é outra alteração muito comum. Os valores para a cor são números ponto flutuante de 0 a 1, 0 é preto, 1 é branco
meuObjeto.setColor(R, G, B, A)
Se os seus modelos tem texturas, eles podem não ser distinguidos ou mesmo ficarem visíveis com certas cores. Configurar a cor para branco vai restaurar a visibilidade da textura, mas é melhor simplesmente limpar as configurações de cor atuais.
meuObjeto.clearColor()
Note que o quarto componente da cor é Alpha. O alpha normalmente é usado para indicar transparência, e normalmente 1 indica que o objeto não é transparente. Se você colocar alpha num valor entre 0 e 1, você pode deixar o objeto invisível. Contudo, em ordem para o valor alpha ser respeitado, você primeiro deve habilitar a transparência:
meuObjeto.setTransparency(TransparencyAttrib.MAlpha)
O parâmetro passado para o setTransparency() é normalmente TransparencyAttrib.MAlpha, que é uma transparência comum. Você também pode explicitamente desligar a transparência com TransparencyAttrib.MNone. (Outros modos de transparência são possíveis, mas isto é assunto para um tópico mais avançado). Se você não habilitar explicitamente a transparência primeiro, o valor para alpha vai ser ignorado. Tenha certeza que você não habilitou transparência sem necessidade já que a transparência usa um mode de renderização mais pesado.
Configurar a cor de um objeto completamente repõe a cor nas vértices. Contudo, se você criar um modelo com cor por vértice, talvez você queira modular a cor do objeto sem perder a cor da vértice. Para isso, existe a variante setColorScale():
meuObjeto.setColorScale(R, G, B, A)
O primeiro uso de setColorScale() vai aplica-lo ao topo da scene graph, para escurecer todo o cenrário uniformemente, por exemplo para implementar um efeito fade-to-black.
Já que o alpha é tão importante, também existe um método para ele que não afeta os outros componentes de cor:
meuObjeto.setAlphaScale(SA)
Para prevenir temporariamente um objeto de ser desenhado em todas as câmeras, use hide() e show()
meuObjeto.hide() meuObjeto.show()
Se você quer esconder um objeto de uma câmera mas não de outra, você pode usar os comandos hide e show na junção com a função camera.setCameraMask():
camera1.node().setCameraMask(BitMask32.bit(0)) camera2.node().setCameraMask(BitMask32.bit(1)) meuObjeto.show(BitMask32.bit(1))
Por favor, note que ao usar hide/show sem argumento vai bagunçar qualquer show/hide com argumento. Para esconder um objeto de todas as cameras use meuObjeto.hide(BitMask32.allOn()). Para usar a mask da câmera como padrão use base.cam, e não base.camera. Para veja a seção Câmera para informações sobre como usar múltiplas câmeras.
Qualquer objeto que está ligado ao objeto escondido também vai ficar escondido.
Se você está encontrando problemas ao alocar, dimensionar, ou girar seus objetos, você pode usar a função place() para te ajudar. Você deve ter o TkInter instalado para usá-lo.
meuObjeto.place()