आसान एक परिप्रेक्ष्य अनुकरण छवि हेरफेर का उपयोग कर बिगाड़ना से, आप इस्तेमाल कर सकते हैं OpenGL या DirectX (XNA) करने के लिए वास्तव में परिप्रेक्ष्य प्रदर्शन प्रदर्शन करते हैं।
बनावट मानचित्र के रूप में अपनी छवि के साथ एक साधारण ट्रैक्टर प्रस्तुत करें। अपने दृश्य को सेटअप करें, एक बफर को प्रस्तुत करें, और आपके पास अपनी छवि है।
अद्यतन यह पता चला है कि एक्सएनए एक हास्यास्पद पुस्तकालय है (गेम बनाने की दिशा में तैयार है और कुछ भी नहीं, यॉन)। प्रबंधित डायरेक्टएक्स को मस्तिष्क लोबोटॉमी की आवश्यकता होती है। ओपनजीएल का उपयोग करना आसान है, लेकिन छवि लोडिंग कोड की कमी है। यही कारण है कि हमें WPF के साथ छोड़ देता है:
alt text http://praeclarum.org/so/persp.png
छवि विरोधी उर्फ मोड में WPF के लिए मजबूर द्वारा सुधार किया जा सकता है (क्यों ओह क्यों माइक्रोसॉफ्ट तुम इतनी अदूरदर्शी कर रहे हैं?), और एयरो ग्लास जो सैन्य बलों का इस्तेमाल नहीं द्वारा सभी स्क्रीनशॉट पर 1 पिक्सेल काली सीमा (या उस पिक्सेल सीमा को हटाकर)।
(इस कोड की लंबाई के लिए क्षमा करें, लेकिन WPF एक बातूनी एपीआई है।)
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 अंक को 3 डी रोटेशन में कैसे परिवर्तित करते हैं? –