쉽게 이미지 조작을 사용하여 왜곡되고 관점을 시뮬레이션하는 대신 사용할 수는 OpenGL 또는 DirectX를 (XNA)에 실제로 원근법 디스플레이를 수행하십시오.
이미지와 함께 간단한 쿼드를 텍스처 맵으로 렌더링하십시오. 씬을 설정하고 버퍼로 렌더링하면 이미지가 생깁니다.
업데이트 XNA는 우스운 라이브러리 (게임을 만드는 것 외에는 아무것도 만들지 않습니다. 하품)입니다. Managed DirectX는 뇌 충혈을 필요로합니다. OpenGL은 사용하기 쉽지만 이미지로드 코드가 없습니다. 즉 WPF 우리 잎 :
alt text http://praeclarum.org/so/persp.png
이미지가 앤티 앨리어싱 모드로 WPF를 강제로 개선 될 수있다 (왜 오 Microsoft는 지금 목격 짧은 이유?), 어느 세력 에어로 유리를 사용하지 않음으로써 모든 스크린 샷에서 1 픽셀 검정 테두리 (또는 그 1 픽셀 테두리 제거).
(이 코드의 길이에 대한 미안하지만, WPF는 수다스러운 API입니다.)
public partial class Window1 : Window {
const float ANGLE = 30;
const float WIDTH = 8;
public Window1() {
InitializeComponent();
var group = new Model3DGroup();
group.Children.Add(Create3DImage(@"C:\Users\fak\Pictures\so2.png"));
group.Children.Add(new AmbientLight(Colors.White));
ModelVisual3D visual = new ModelVisual3D();
visual.Content = group;
viewport.Children.Add(visual);
}
private GeometryModel3D Create3DImage(string imgFilename) {
var image = LoadImage(imgFilename);
var mesh = new MeshGeometry3D();
var height = (WIDTH * image.PixelHeight)/image.PixelWidth;
var w2 = WIDTH/2.0;
var h2 = height/2.0;
mesh.Positions.Add(new Point3D(-w2, -h2, 0));
mesh.Positions.Add(new Point3D(w2, -h2, 0));
mesh.Positions.Add(new Point3D(w2, h2, 0));
mesh.Positions.Add(new Point3D(-w2, h2, 0));
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(2);
mesh.TriangleIndices.Add(3);
mesh.TextureCoordinates.Add(new Point(0, 1)); // 0, 0
mesh.TextureCoordinates.Add(new Point(1, 1));
mesh.TextureCoordinates.Add(new Point(1, 0));
mesh.TextureCoordinates.Add(new Point(0, 0));
var mat = new DiffuseMaterial(new ImageBrush(image));
mat.AmbientColor = Colors.White;
var geometry = new GeometryModel3D();
geometry.Geometry = mesh;
geometry.Material = mat;
geometry.BackMaterial = mat;
geometry.Transform = new RotateTransform3D(
new AxisAngleRotation3D(new Vector3D(0,1,0), ANGLE),
new Point3D(0, 0, 0));
return geometry;
}
public static BitmapSource LoadImage(string filename) {
return BitmapDecoder.Create(new Uri(filename, UriKind.RelativeOrAbsolute),
BitmapCreateOptions.None, BitmapCacheOption.Default).Frames[0];
}
}
그리고 필요한 XAML :
이
<Window x:Class="Persp.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Perspective Window" Height="480" Width="640">
<Grid>
<Viewport3D x:Name="viewport">
<Viewport3D.Resources>
</Viewport3D.Resources>
<Viewport3D.Camera>
<PerspectiveCamera x:Name="cam"
FarPlaneDistance="100"
LookDirection="0,0,-1"
UpDirection="0,1,0"
NearPlaneDistance="1"
Position="0,0,10"
FieldOfView="60" />
</Viewport3D.Camera>
</Viewport3D>
</Grid>
</Window>
문제는 어떻게 4 포인트를 3D 회전으로 변환합니까? –