Вопрос

Сегодня я начал изучать 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>

Редактировать: Я просто поэкспериментировал с положением камеры и направлением взгляда и, наконец, увидел кое-что, когда изменил направление взгляда на не перпендикулярно к самолету, например:

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

Является ли это нормальным поведением?

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

геххо.

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top