Pergunta
Comecei a aprender alguns 3D no WPF hoje e copiei alguns exemplos simples (aviões) no meu XAML, e todos eles funcionaram. No entanto, quando ajustei as coordenadas da câmera e do avião para atender às minhas necessidades, sempre não vejo nada.
Não sei o que estou fazendo de errado e também já esboçei a cena 3D (realmente simples) para verificar meus dados, e tudo parece correto para mim.
Alguém poderia verificar o seguinte xaml e me dizer o que estou fazendo de errado? Eu só quero criar um avião no plano XZ, ou seja, algum tipo de "piso" com a câmera olhando para baixo por cima.
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="0 1 0"
LookDirection="0 -1 0"
FieldOfView="60"/>
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D>
<ModelVisual3D.Content>
<AmbientLight Color="White"/>
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D>
<MeshGeometry3D.Positions>
<Point3D X="-1" Y="0" Z="1"/>
<Point3D X="1" Y="0" Z="1"/>
<Point3D X="1" Y="0" Z="-1"/>
<Point3D X="-1" Y="0" Z="-1"/>
</MeshGeometry3D.Positions>
<MeshGeometry3D.TriangleIndices>
0 1 2 0 2 3
</MeshGeometry3D.TriangleIndices>
<MeshGeometry3D.Normals>
<Vector3D X="0" Y="1" Z="0"/>
<Vector3D X="0" Y="1" Z="0"/>
<Vector3D X="0" Y="1" Z="0"/>
<Vector3D X="0" Y="1" Z="0"/>
<Vector3D X="0" Y="1" Z="0"/>
<Vector3D X="0" Y="1" Z="0"/>
</MeshGeometry3D.Normals>
</MeshGeometry3D>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Red" Opacity="0.75"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</MaterialGroup>
</GeometryModel3D.Material>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
EDITAR: Acabei de experimentar a posição e a direção da câmera e finalmente vi algo quando mudei a direção da aparência para ser não perpendicular para o avião, por exemplo:
<PerspectiveCamera Position="0 2 0"
LookDirection="0 -2 1"
FieldOfView="60"/>
Isso é comportamento normal?
Muito Obrigado!
Gehho.
Solução
Quando você está apontando a câmera, é importante cuidar do Vector UP bem como a direção da aparência.
O problema vem do valor padrão do vetor up (PerspectiveCamera.UpDirection
), que é [0,1,0]. A aparência e os vetores da câmera não devem ser paralelos, porque nesse caso seria impossível saber para que caminho está acontecendo.
Como seu modelo está no plano XZ e você deseja olhar para baixo, você pode simplesmente definir atualização para [0,0,1] ou [1,0,0], de modo que os pontos da UP na direção de qualquer um Z ou o eixo X, respectivamente. Mas se você planeja permitir que a câmera observe em todas as direções, deve cuidar do vetor da UP também.