Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 07:53

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[TU]_[VB] Wellen in DirectX

Discussion on [TU]_[VB] Wellen in DirectX within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Nov 2009
Posts: 920
Received Thanks: 422
[TU]_[VB] Wellen in DirectX

Wellen in DirectX und Visual Basic

1. Vorwort
2. Einführung
3. Vertexaufbau
4. Die Wellen
5. Die Kiste
6. Das fertige Projekt
7. Fazit
8. Nachwort

Vorwort

Dieses Tutorial beschäftigt sich mit der Erstellung einer möglichst realistisch wirkenden Wasseroberfläche und baut auf der DirectX Tutorialserie von DIrectX Tutorials | Jack Hoxley auf. Da ich in VB nur sehr wenige wirklich gute Beispielcodes fand, habe ich mich entschlossen dieses Thema zu behandeln. Unser Ziel ist es diese Wasseroberfläche so flexibel, realistisch und schnell wie möglich zu machen. Hierfür verwende ich einige Rechentechniken aus der Trigonometrie, welche aber auch für jüngere Leser leicht zu verstehen sein werden. Da ich selbst noch vieles in DirectX lernen kann, würde ich mich freuen, wenn ich reichlich Emails bekommen würde um diese Szene noch realistischer wirken zu lassen. Beispielsweise könnte man diese Szenen noch mit zusätzlichem Lightning und Fogging ausstatten. Auch ist zu sagen, dass selbst Spiele wie Counterstrike nicht mit allzu realistischen Wasseroberflächen dienen können.

Einführung

Um eine Wasseroberfläche in DirectX zu erstellen, braucht man zuerst mal einen Ansatz, wie die Wellen, welche erstellt werden, auszusehen haben. Es gibt im wesentlichen 3 Arten, welche ich am sinnvollsten ansehe. Die erste Art, ist die Wellenbewegung in Form eines sich von einem Zentrum wegbewegenden Wellenzirkels. Hierzu 2 Skizzen:



Die Pfeile auf der rechten Seite stellen die Orientierung der Wellen, die Kreise die Wellen selbst dar. Die zweite Art ist eine Oberfläche, welche aus verschiedenen sich auf und ab bewegenden Aufstiegspunkten besteht. Diese Sorte lasse ich allerdings nur sehr wenig Aufmerksamkeit zukommen, da sie nicht sehr realistisch wirkt. Diese Art wurde in ersten 3D- Anwendungen verwendet.



Die hier als letzte angesprochne Wasseroberfläche ist linear, das heißt sie bewegt sich von rechts nach links, bzw. anders herum. In diesem Beispiel ist ebenfalls eine Mathematische Rechenart von Nöten. Diese Wellenbewegung wollen wir nun vertiefen. Hierzu eine Skizze:


Bevor wir aber starten, möchte ich auf die Geschwindigkeit, der oben angesprochenen Wellenarten, zu sprechen kommen. Die erste und zweite Art benötigt n² mal so viele Vertices um die Wasseroberfläche zu erstellen wie die, welche wir im Anschluss besprechen. Die erste Art benötigt von der Bearbeitung dann noch eine Pufferstärke, welche die Lineare Methode um längen übersteigt. Alles in allem, bin ich zu dem Schluss gekommen, dass die Lineare Methode für uns die beste Mischung aus Realismus, Geschwindigkeit und Flexibilität darstellt.

Vertexaufbau

Zu erst müssen wir uns um den Vertexaufbau kümmern. Hier werden Frage geklärt was für Vertices wir benötigen, welche Vor- und Nachteile sie besitzen und wie wir sie in ein „vernünftiges“ Programm bringen. Um die Flexibilität zu gewährleisten erstellen wir eine Schnittstelle von diesem Typ:

Code:
Public Sub CreateWaves(Move As Single, Wellenhöhe As Single, Fliesgeschwindigkeit As Single, Länge As Single, Breite As Single)
[…]
End Sub
“Move” steht später für die Bewegung der Wellen, „Wellenhöhe“ für die Streckung unserer Amplitude, „Fliesgeschwindigkeit“ hat mit der anschließenden Texturierung des Primitive zu tun, „Länge“ und „Breite“ sind Variablen für die Ausmaße der Wasseroberfläche.



Es gibt verschiede Möglichkeiten und Vertexarten um die Wasseroberfläche zu gestallten. Ich denke, dass es einleuchtet, wenn wir zur Erstellung Dreieck-Strips (D3DPT_TRIANGLESTRIP) verwenden. Ich habe das gleiche Beispiel einmal mit Dreieck-Listen (D3DPT_TRIANGLELIST) programmiert. Allerdings sind hier unschöne Lücken aufgetreten. Wahrscheinlich waren es Rundungsfehler. Mit den Dreieck- Strips tritt so etwas natürlich nicht auf. Außerdem ist die Arbeit mit der Textur anschließend wesentlich leichter. In diesem Bild kann man schon einige Ansätze an Wellen erkennen. Wir benötigen in der fertigen Wasseroberfläche 60 Aufzugspunkte. Natürlich ist es anschließend dem Leser vorbehalten diese Zahl zu ändern. Mehr machen die Oberfläche genauer aber auch langsamer.

Nun zu der Architektur der Oberfläche, die y- Koordinate der Vertices besprechen wir direkt im Anschluss, denn noch sind sie nicht wichtig für uns.



Um dieses Netz zu kreieren brauchen wir eine Schleife, die jeweils den geraden und ungeraden Vertex bearbeitet.

Code:
For X = -15 To 15
[…]
Next X

Die Schleife bearbeitet insgesamt (15 - (-15)) * 2 = 60 Punkte

Hier die Vertices. Zunächst beschreibe ich die Parameter, welche für uns von Interesse sind.

Dim Waves(61) As LITVERTEX

Waves((X + 15) * 2 + 0) = CreateLitVertex(X * Länge, Sin(X + move) * Wellenhöhe _
, Breite, C110, 0, ((X + 15) / 30) + move / Fliesgeschwindigkeit, 1)
Waves((X + 15) * 2 + 1) = CreateLitVertex(X * Länge, Sin(X + move) * Wellenhöhe _
, -Breite, C010, 0, ((X + 15) / 30) + move / Fliesgeschwindigkeit, 0)
Kommen wir zuerst zum Arrayfeld: Waves((X + 15) * 2 + 0). Da unser Array korrekt aufsteigen soll, benötigen wir diese, recht einfach zu verstehende mathematische Formel. Die Schleife beginnt Anfangs mit: Waves(0) dann Waves(1) usw.
Der erste Parameter stellt die X- Koordinate dar. „Länge“ ist dafür verantwortlich die Wasseroberfläche zu strecken. Der dritte Parameter stellt lediglich die Breite der Wasseroberfläche dar. Ich habe die Breite 30 gewählt. Nummer 4 ist die Farbe des einzelnen Vertex, hier eine Konstante, welche ist aus den vorhergegangenen Tutorials von Jack Hoaxley übernommen habe. Parameter Nummer 5 hat für uns ebenfalls keine Bedeutung. Die letzten beiden Parameter sind für die Textur verantwortlich.

Code:
Dim Texture As Direct3DTexture8

Set Texture = D3DX.CreateTextureFromFileEx(D3DDevice, App.Path & "\wasser.jpg", 128, 128, D3DX_DEFAULT, 0, DispMode.Format, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, ByVal 0, ByVal 0)
Da wir die Höhe der einzelnen Vertices verändern, müssen wir der Grafikkarte noch sagen, wie sie die Textur auf unseren Primitive zu setzen hat. „Fliesgeschwindigkeit“ und „move“ sind dafür da um das Wasser in Bewegung zu bringen. Spielt ruhig ein wenig mit den Werten herum um zu erkennen wie der Computer die Werte verarbeitet. Learning by doing ist wieder einmal das Stichwort.

FreeZoNe1992 is offline  
Old 03/20/2010, 21:17   #2
 
Pand0r's Avatar
 
elite*gold: 1438
Join Date: Jun 2007
Posts: 3,214
Received Thanks: 758
#moved
Pand0r is offline  
Old 03/22/2010, 04:28   #3

 
x]vIrus[x's Avatar
 
elite*gold: 37
Join Date: Apr 2004
Posts: 2,154
Received Thanks: 250
wenn du tutorials klaust, dann klaue sie doch bitte vollständig

#vote for close / delete
x]vIrus[x is offline  
Reply


Similar Threads Similar Threads
Directx Sdk
07/09/2010 - General Coding - 3 Replies
hi liebe com, ich möchte mal wissen wie man direct x sdk in cisual c++ einbindet oder so
Directx Pub
04/07/2010 - WarRock Hacks, Bots, Cheats & Exploits - 10 Replies
Hack wurde schon einmal gepostet tut mir sehr leid ! #Bitte Closen ! !
help directx
08/27/2009 - SRO Private Server - 2 Replies
I have windows vista I use directx 10 when I open the silk asks 9.0b but ja intal but still this the 10.ajuda please picturehttp://img198.imageshack.us/img198/206/ero o.jpg http://img198.imageshack.us/img198/206/eroo.jpg
need help for directx
06/09/2009 - SRO Private Server - 2 Replies
Hi. I have some problem with ECSRO and directx 9b. i cant do that thing with capability because there are't xp sp2 http://img7.imageshack.us/img7/9180/bepavadinimop. jpg i have been try directx 9, 9b and 9c but nothing. What i need do? Error pic http://img7.imageshack.us/img7/9741/directxi.jpg sorry for bad english
directx
05/02/2008 - SRO Private Server - 9 Replies
hello all, i got a problem :/ i got windows vista! and the problem is i got direct x 10! And there stands you need 9.0 or newer :eek::S! and i got a newer version... can some 1 help me:confused: and i play ecsro <--- want xD tyyy ;p sorry for BAD ENGLISH!=]



All times are GMT +1. The time now is 07:54.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.