Textur im Dreieck?
-
Hallo,
ich beschäftige mich seit Kurzem mit 3D-Grafik. Es klappt alles wunderbar, nur dass ich ein Problem mit der Textur habe. Wenn ich ein Dreieck mit einem TextureBrush in ein Programm zeichne, und dieses sich bewegen soll, bewegt sich zwar das Dreieck, aber nicht die Textur mit. Ebenso wenn ich ein aus mehreren Dreiecken bestehendes Objekt drehen will. Ich hab mir alles was ich von 3D-Programmierung weiß selbst über verschiedene Websites beigebracht, weswegen ich noch keine richtige Erfahrung damit hab ;). Wär gut, wenn mir jemand helfen könnte dieses Problem zu lösen :D.
-
Möchtest du einen Software-Rasterizer schreiben oder verstehe ich dich falsch? Wenn ja solltest du den Brush ganz schnell vergessen und damit anfangen, selbst Pixel durch deine eigene Pipeline zu pushen.
Du musst Screen-Space und Texture-Space separieren, und für jedes Pixel deiner Triangles die UV-Koordinaten der zugehörigen Textur berechnen, und damit einen Texel-Lookup bauen. Das tönt komplizierter als es eigentlich ist.
Hier ein wichtiges Stichwort für dich: Baryzentrische Koordinaten. Eventuell findest du sogar ein Tutorial mit fertigem Code.
MfG
-
Ich vermute mal er verwendet WPF...
Was genau meinst du damit dass "die Textur sich nicht mitbewegen soll"!?
-
hm, das ist ein wenig kompliziert zu erklären ^^.
dot schrieb:
Was genau meinst du damit dass "die Textur sich nicht mitbewegen soll"!?
Sie soll sich ja gerade bewegen ;), aber ich weiß nicht wie die Textur sich bewegen lässt.
Wenn sich das Dreieck bewegt, sieht man plötzlich einen anderen Teil der Textur. Das soll ja aber nicht so sein! Die Textur muss ja fest am Dreieck sein. Also muss sich die Textur ja die selben Pixel, wie das Dreieck bewegen, um die Textur im Dreieck nicht zu verschieben.
-
Dann check mal ab wieso sich deine Texturkoordinaten plötzlich ändern...
-
dot schrieb:
Dann check mal ab wieso sich deine Texturkoordinaten plötzlich ändern...
Es gibt ja nicht einmal Texturkoordinaten, wenn ich das Dreieck mittels des PaintEventArgs und einem TextureBrush zeichnen lasse.
-
Ohne Texturkoordinaten keine Textur. Dein TextureBrush generiert nur eben offenbar Texturkoordinaten, die nicht dem entsprechen, was du willst. Vermutlich ist TextureBrush eben nicht was du willst...
-
Falls es hilft hier mal mein Text:
System::Void RendGame(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { array<PointF> ^ point = gcnew array<PointF>(3); System::Drawing::Brush ^ brush = gcnew System::Drawing::TextureBrush(bitTexture, System::Drawing::Drawing2D::WrapMode::Clamp); point[0] = PointF((v1.x / v1.z), (v1.y / v1.z)); //v1 stellt eine von mir erstellte value class, mit 3 float-Koordinaten dar. point[1] = PointF((v2.x / v2.z), (v2.y / v2.z)); point[2] = PointF((v3.x / v3.z), (v3.y / v3.z)); e->Graphics->FillPolygon(brush, point); }
-
Vielleicht hilft dir das: http://msdn.microsoft.com/en-us/library/13fy233f.aspx
Wenn du willst dass die Vertices bestimmte Texturkoordinaten haben, dann musst du dich auch drüm kümmern. Was soll man da sonst noch dazu sagen, ist eben einfach so!?
Und das solltest du auch unbedingt lesen: http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/
-
dot schrieb:
Vielleicht hilft dir das: http://msdn.microsoft.com/en-us/library/13fy233f.aspx
Danke, hat geholfen :D. Wusste nicht wie ich die Textur verschiebe.
-
Eine Frage hätte ich noch: Wie lege ich bei "RotateTransform(float angle)" den Punkt fest um den sich die Textur drehen soll? Ich hab das Gefühl, dass dieser bei (0 | 0) liegt. Er muss ja aber genau an dem Punkt liegen, an dem auch das Dreieck rotiert (meist Mittelpunkt des Dreiecks), damit die Textur im Dreieck korrekt dargestellt wird. Wie mache ich sowas?