Проблемы с 3D WPF - PullRequest
       31

Проблемы с 3D WPF

1 голос
/ 10 марта 2010

Сегодня я начал изучать 3D в WPF и скопировал несколько простых примеров (плоскостей) в мой XAML, и все они работали. Однако, когда я отрегулировал координаты камеры и самолета в соответствии со своими потребностями, я всегда ничего не вижу.

Я не знаю, что я делаю неправильно, и я также уже набросал (действительно простую) 3D-сцену для проверки своих данных, и мне все кажется правильным.

Может ли кто-нибудь проверить следующий XAML и сказать, что я делаю не так? Я хочу создать плоскость только в плоскости x-z, то есть в каком-то «полу», когда камера смотрит сверху вниз.

<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>

РЕДАКТИРОВАТЬ: Я только что экспериментировал с позицией камеры и LookDirection, и, наконец, что-то увидел, когда я изменил LookDirection на не перпендикулярно к плоскости, например:

<PerspectiveCamera Position="0 2 0"
                   LookDirection="0 -2 1"
                   FieldOfView="60"/>

Это нормальное поведение?

Большое спасибо!

gehho.

1 Ответ

2 голосов
/ 11 марта 2010

Когда вы наводите камеру, важно следить за вектором Up , а также за направлением взгляда.

Проблема заключается в значении по умолчанию для вектора Up (PerspectiveCamera.UpDirection), которое составляет [0,1,0]. Векторы Look и Up камеры не должны быть параллельными, потому что в этом случае невозможно определить, какой путь вверх.

Поскольку ваша модель находится в плоскости XZ, и вы хотите взглянуть на нее сверху вниз, вы можете просто установить UpDirection на [0,0,1] или [1,0,0], чтобы вверх указывала в направлении либо оси Z или X, соответственно. Но если вы планируете позволить камере смотреть во всех направлениях, вам следует позаботиться и о векторе Up.

...