salve
ich möchte ein wenig in die materie der grafikprogrammierung mittels directx eintauchen, habe mir dazu das directX SDK besorgt. desweiteren habe ich mich auch durch das directx tutorial von hauptmann durchgeschlagen, bis zu dem punkt , an dem matrizen behandelt werden, also gezeichnete objekte quasi gedreht werden.
in dem sdk tutorial 1 wurde ein fenster mit blauem grund erzeugt und un tutorial 2 ein dreieck gezeichnet.
schön und gut, habeich hinbekommen und kann es auch einigermaßen nachvollziehen.
doch wenn es um bewegung geht, komme ich nicht mehr weiter. leider beschreiben das sdk tutorial und hauptmanns es für mich nicht leicht genug.
vor allem der sprung von teil 2 zu 3 ist schwer.
hier einmal der code aus dem 2ten teil, der ein dreieck rendert:
//-----------------------------------------------------------------------------
// File: Vertices.cs
//
// Desc: In this tutorial, we are rendering some vertices. This introduces the
// concept of the vertex buffer, a Direct3D object used to store
// vertices. Vertices can be defined any way we want by defining a
// custom structure and a custom FVF (flexible vertex format). In this
// tutorial, we are using vertices that are transformed (meaning they
// are already in 2D window coordinates) and lit (meaning we are not
// using Direct3D lighting, but are supplying our own colors).
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace VerticesTutorial
{
public class Vertices : Form
{
// Our global variables for this project
Device device = null; // Our rendering device
VertexBuffer vertexBuffer = null;
public Vertices()
{
// Set the initial size of our form
this.ClientSize = new System.Drawing.Size(300,300);
// And its caption
this.Text = "Direct3D Tutorial 2 - Vertices";
}
public bool InitializeGraphics()
{
try
{
// Now let's setup our D3D stuff
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed=true;
presentParams.SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
this.OnCreateDevice(device, null);
return true;
}
catch (DirectXException)
{
return false;
}
}
public void OnCreateDevice(object sender, EventArgs e)
{
Device dev = (Device)sender;
// Now Create the VB
vertexBuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored), 3, dev, 0, CustomVertex.TransformedColored.Format, Pool.Default);
vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vertexBuffer, null);
}
public void OnCreateVertexBuffer(object sender, EventArgs e)
{
VertexBuffer vb = (VertexBuffer)sender;
GraphicsStream stm = vb.Lock(0, 0, 0);
CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[3];
verts[0].X=150;verts[0].Y=50;verts[0].Z=0.5f; verts[0].Rhw=1; verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
verts[1].X=250;verts[1].Y=250;verts[1].Z=0.5f; verts[1].Rhw=1; verts[1].Color = System.Drawing.Color.Brown.ToArgb();
verts[2].X=50;verts[2].Y=250;verts[2].Z=0.5f; verts[2].Rhw=1; verts[2].Color = System.Drawing.Color.LightPink.ToArgb();
stm.Write(verts);
vb.Unlock();
}
private void Render()
{
if (device == null)
return;
//Clear the backbuffer to a blue color (ARGB = 000000ff)
device.Clear(ClearFlags.Target, System.Drawing.Color.Blue, 1.0f, 0);
//Begin the scene
device.BeginScene();
device.SetStreamSource( 0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
//End the scene
device.EndScene();
device.Present();
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
this.Render(); // Render on painting
}
protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{
if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
this.Close(); // Esc was pressed
}
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
using (Vertices frm = new Vertices())
{
if (!frm.InitializeGraphics()) // Initialize Direct3D
{
MessageBox.Show("Could not initialize Direct3D. This tutorial will exit.");
return;
}
frm.Show();
// While the form is still valid, render and process messages
while(frm.Created)
{
frm.Render();
Application.DoEvents();
}
}
}
}
}
im 3. teil gibt es jetzt aber einige änderungen, die ich nicht auf die reihe kriege. transformedcolored und positioncolored verstehe ich noch. woran es aber hapert sind z.b. die verts.
verts[0].X=-1.0f; verts[0].Y=-1.0f; verts[0].Z=0.0f; verts[0].Color = System.Drawing.Color.DarkGoldenrod.ToArgb();
verts[1].X=1.0f; verts[1].Y=-1.0f ;verts[1].Z=0.0f; verts[1].Color = System.Drawing.Color.MediumOrchid.ToArgb();
verts[2].X=0.0f; verts[2].Y=1.0f; verts[2].Z = 0.0f; verts[2].Color = System.Drawing.Color.Cornsilk.ToArgb();
wieso sind das hier so kleine koordinaten, und nicht wie im teil davor z.b. 150 oder so und was soll das f dahinter. ic glaube das heisst float, aber kann man sich das nicht sparen ?
so das war eine neureung, jetzt die andere. bevor man rendert, wird die funktion SetupMatrices() aufgerufen, die glaube ich dafür sorgt, dass sich das objekt scheinbar dreht. dreht sich eigentlich das objekt oder dreht sich die kamera ?
int iTime = Environment.TickCount % 1000;
float fAngle = iTime * (2.0f * (float)Math.PI) / 1000.0f;
device.Transform.World = Matrix.RotationY( fAngle );
device.Transform.View = Matrix.LookAtLH( new Vector3( 0.0f, 3.0f,-5.0f ), new Vector3( 0.0f, 0.0f, 0.0f ), new Vector3( 0.0f, 1.0f, 0.0f ) );
device.Transform.Projection = Matrix.PerspectiveFovLH( (float)Math.PI / 4, 1.0f, 1.0f, 100.0f );
also da versteh ich ja garnichts mehr. wo ist denn da irgendwo eine funktion, die das bild alle x sekunden dreht ?
und ich verstehe eigentlich die komplette funktion nicht.
vielleicht könnt ihr ja ein wenig licht ins dunkle bringen.
danke im vorraus
mfg
(8(|)