문제
나는 오늘 WPF에서 3D를 배우기 시작했고 간단한 예제 (비행기)를 내 XAML에 복사했으며 모두 일했습니다. 그러나 카메라와 비행기의 좌표를 조정하여 내 요구를 충족시키기 위해 항상 아무것도 볼 수 없습니다.
나는 내가 무엇을 잘못하고 있는지 모르고, 이미 내 데이터를 확인하기 위해 (정말 간단한) 3D 장면을 스케치했으며, 모두 나에게 정확해 보입니다.
누구든지 다음 XAML을 확인하고 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까? XZ 평면에서 비행기 만 만들고 싶습니다. 즉, 카메라가 상단에서 아래로 내려다 보면서 일종의 "바닥"을 만들고 싶습니다.
<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"/>
이것이 정상적인 행동입니까?
많은 감사합니다!
Gehho.
해결책
카메라를 가리키면 조심하는 것이 중요합니다. 위 벡터 외모 방향뿐만 아니라.
문제는 UP 벡터의 기본값에서 비롯됩니다 (PerspectiveCamera.UpDirection
), [0,1,0]. 카메라의 외관과 벡터는 평행하지 않아야합니다.이 경우 어떤 방식으로 상승하는지 말하기는 불가능하기 때문입니다.
모델이 XZ 평면에 있고 그것을 내려다보고 싶기 때문에, 당신은 단순히 [0,0,1] 또는 [1,0,0]로 업데이트를 설정하여 각각 z 또는 x 축. 그러나 카메라가 모든 방향으로 볼 수 있도록 할 계획이라면 UP 벡터도 처리해야합니다.
제휴하지 않습니다 StackOverflow