nachdem wir im letzten Tutorial gelernt haben Mesh zu bewegen zeig ich Euch heute ein praktische Umsetzung um eine Fahne wehen zu lassen. Die hier verwendete Formel ist trickreich und leicht erklärt.
Als erstes benötigen wir einen float angle Wert der über den time Faktor erzeugt wird
Code: Alles auswählen
float angle= time *4;
Die Bewegung der Fahne wird erst einmal sinusförmig über
Code: Alles auswählen
v.z = sin( v.x+angle)
danach wird die halbe Sinuswelle über die Höhe berechnet, da die Fahne sich nie gleichförmig bewegt
Code: Alles auswählen
v.z += sin( v.y /2+angle);
Mit dem nächsten Trick wird die Fahne am Anfang gar nicht bewegt, aber je weiter weg desto oller äh doller.
das Mesh beginnt bei x position -10 und endet bei x position + 10. demnach ist halvewidh bei diesem Mesh 10. Mit diesem Trick wird links am Mesh keien Bewegung ausgeführt, da ja bekanntlich v.z = v.z * (-10+10)* 0.09 = 0 ist (rechnet es ruhig nach) bei v.x = 10 kommt was anderes rausv.z *= (v.x+halvewidh ) * 0.09f;
Der Shader braucht jetzt nur noch
http://www.flasharts.de/mpz/flagge.x
http://www.flasharts.de/mpz/Flagge.JPG
im Shadereditor wird das Mesh Flagge.x geladen und als texture0 die flagge.jpg
Vom Shadereditor übergeben Variablen:
worldViewProj -> Weltposition vom Editor übergeben
texture0 -> geladene Textur, z.B. "flagge.jpg"
time -> die laufende Zeit in ms
Code: Alles auswählen
//-----------------------------------------------------------------------------
// Name: MoveFlagge.fx
// Author: Michael Paulwitz
// Last Modified: 10.04.12
// Description: move Flag
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Effect File Variables
//-----------------------------------------------------------------------------
float4x4 worldViewProj : WorldViewProjection; // This matrix will be loaded by the application
texture texture0;
float time;
float halvewidh = 10;
sampler Sampler1 = sampler_state
{
texture = <texture0>;
};
//-----------------------------------------------------------------------------
// Vertex Definitions
//-----------------------------------------------------------------------------
// Our sample application will send vertices
// down the pipeline laid-out like this...
struct VS_INPUT
{
float3 position : POSITION;
float2 texture0 : TEXCOORD0;
};
// Once the vertex shader is finished, it will
// pass the vertices on to the pixel shader like this...
struct VS_OUTPUT
{
float4 hposition : POSITION;
float2 texture0 : TEXCOORD0;
};
//-----------------------------------------------------------------------------
// Simple Vertex Shader
//-----------------------------------------------------------------------------
VS_OUTPUT myvs( VS_INPUT IN )
{
VS_OUTPUT OUT;
float4 v = float4( IN.position.x, IN.position.y, IN.position.z, 1.0f );
float angle= time*4;
v.z += sin( v.x+angle) ;
v.z += sin( v.y /2+angle);
v.z *= (v.x+halvewidh ) * 0.09f;
OUT.hposition = mul( v, worldViewProj );
OUT.texture0 = IN.texture0;
return OUT;
}
//-----------------------------------------------------------------------------
// Simple Effect (1 technique with 1 pass)
//-----------------------------------------------------------------------------
technique flag
{
pass Pass0
{
Sampler[0] = (Sampler1); // Needed by pixel shader
VertexShader = compile vs_2_0 myvs();
}
}
Code: Alles auswählen
v.z *= (v.y-6 ) * 0.09f;
Gruß Michael