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.

Foi útil?

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.

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