Почему LookDirection перспективной камеры не может быть прямо вниз? - PullRequest
1 голос
/ 01 мая 2010

Я пытаюсь расположить свою перспективную камеру на 30 единиц выше начала координат и направить прямо вниз.

Если я установлю LookDirection камеры на «0,0, -1», все исчезнет. Я должен сделать это "0.01,0.01, -1", чтобы это работало. Почему?

<Window
    x:Class="ThreeDeeTester.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1"
    Height="300"
    Width="300">
    <Grid>
        <Viewport3D>
            <Viewport3D.Camera>
                <PerspectiveCamera
                    Position="0,0,30"
                    LookDirection="0.01,0.01,-1" 
                    UpDirection="0,0,1" />
                    <!-- LookDirection="0,0,-1" doesn't work...why? -->
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <Model3DGroup>
                        <DirectionalLight
                            Color="White"
                            Direction="1,-1,-1" />
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                    Positions="0,0,10 -5,-5,0 -5,5,0 5,5,0 5,-5,0"
                                    TriangleIndices="2 1 0  2 0 3  4 3 0  1 4 0" />
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial Brush="Red" />
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                    </Model3DGroup>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
    </Grid>
</Window>

1 Ответ

2 голосов
/ 01 мая 2010

Вероятно, он пытается воссоздать полную матрицу камеры, начиная с перекрестного произведения между LookDirection и UpDirection. Результат перекрестного произведения между параллельными векторами равен нулю, поэтому в итоге вы создаете совершенно недопустимую матрицу представления.

Так как вы также устанавливаете UpDirection, почему бы не установить его в направлении, в котором верхняя часть экрана обращена? Это то, что вы должны делать, в любом случае. Представьте, что вы смотрите на свои туфли, в каком направлении указывает ваша голова?

LookDirection и UpDirection должны быть как можно ближе друг к другу под прямым углом, насколько это возможно. Предположительно, программное обеспечение «исправит» вещи, если они не точные, но если вы смотрите «в значительной степени прямо вниз», вероятно, будет хорошей идеей указать, куда вы хотите направить верхнюю часть камеры. Конечно, это только реальная проблема, когда вы смотрите прямо вниз, поскольку любой угол между этими векторами можно использовать для определения правильного правильного вектора угла из LookDirection. Только когда они на самом деле параллельны, становится невозможно узнать, какой должна быть ориентация камеры.

Редактировать: Краткий ответ: установите UpDirection 0,1,0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...