[3D-Tutorial] Hilfe mit Matrix-Rotation

mamarulez

Mitglied
Hallo,

ich habe mal das erste 3D-Tutorial ausprobiert und konnte dem auch so weit - ohne je etwas mit Flash's ActionScript gemacht zu haben - gut folgen. Ich habe einige Dinge etwas anders gemacht und im Endeffekt war ich selbst erstaunt das alles beim ersten Mal schon hundertprozentig hingehauen hat und ich ein richtiges Polygon vor der beweglichen Kamera hatte. :)

Jetzt will ich weiter machen, und zwar will ich erstmal ein Face (steht bei mir für eine Fläche zwischen vier Punkten, weil ich später Würfel bauen will) in einigem Abstand zur Kamera rotieren lassen.

Kurz gesagt, der folgende Quelltext-Auszug bringt das Polygon tatsächlich zum Rotieren, aber es rotiert leider nicht um sich selbst (wie es sollte), sondern um die Kamera. Aus Erfahrungen mit OpenGL dachte ich zu wissen dass da die Reihenfolge der angewandten Transformationen schuld ist, das ist bei diesem Flash-Projekt allerdings scheinbar nicht der Fall, das habe ich schon ausprobiert.

Also, hier ist der komplette Quellcode meines Projektes - ich wäre dankbar für jeden Hilfeversuch, auch wenn mir bewußt ist, dass es schon ein wenig anstrengend und zeitintensiv sein kann, sich in solch ein Quelltext eines anderen einzudenken.

QUELLTEXT ENTFERNT - AKTUELLE VERSION IM LETZTEN POST
 
Zuletzt bearbeitet:
So, ich hab nochmal ein bisschen mehr damit rumgespielt und wollte hier einfach nochmal die neue Version meines Scripts reinstellen. Ich habe einiges geändert, jetzt will ich das Face ersteinmal nur anzeigen und die Kamera bewegen können (mit Hilfe von Matritzen).

So sieht der Quelltext aus:

Code:
screen_width = 640;
screen_height = 480;

function camera ( x, y, z, fov )
// camera
{
	this.x = x;
	this.y = y;
	this.z = z;
	this.fov = fov;
}

function matrix ( )
// matrix with four by four items
{
	this._11 = 1; this._12 = 0; this._13 = 0; this._14 = 0;
	this._21 = 0; this._22 = 1; this._23 = 0; this._24 = 0;
	this._31 = 0; this._32 = 0; this._33 = 1; this._34 = 0;
	this._41 = 0; this._42 = 0; this._43 = 0; this._44 = 1;
}

function translate ( matrix, x, y, z )
// translates
{
	matrix._11=1; matrix._12=0; matrix._13=0; matrix._14=0;
	matrix._21=0; matrix._22=1; matrix._23=0; matrix._24=0;
	matrix._31=0; matrix._32=0; matrix._33=1; matrix._34=0;
	matrix._41=x; matrix._42=y; matrix._43=z; matrix._44=1;
}

function translate_x ( point_x, point_z )
// translates three-dimensional points with x, y and z coordinates to two-dimensional
// ones with only x and y coordinates
{
	// define the new two-dimensional coordinate and translate it
	point_new_x;
		
	if ( point_z + cam.fov != 0 )
		point_new_x = ( cam.fov * point_x ) / ( point_z + cam.fov );
        
	// now add half of the screen to it to create a centered vanishing point 
	point_new_x += screen_width / 2;
        
	// and return the value
	return point_new_x;
}

function translate_y ( point_y, point_z )
// translates three-dimensional points with x, y and z coordinates to two-dimensional
// ones with only x and y coordinates
{
	// define the new two-dimensional coordinate and translate it
	point_new_y;
		
	if ( point_z + cam.fov != 0 )
		point_new_y = -1 * ( cam.fov * point_y ) / ( point_z + cam.fov );
	
	// now add half of the screen to it to create a centered vanishing point 
	point_new_y += screen_height / 2;
	
	// and return the value
	return point_new_y;
}

function vertex ( x, y, z )
// vertex with three coordinates
{
	this.x = x;
	this.y = y;
	this.z = z;
}

function new_vertex ( x, y, z )
// creates new vertex
{
	return new vertex ( x, y, z );
}

function face ( vertex1, vertex2, vertex3, vertex4 )
// face with four vertices
{
	this.vertex1 = vertex1;
	this.vertex2 = vertex2;
	this.vertex3 = vertex3;
	this.vertex4 = vertex4;
	
	this.color = 0xffffff;
}

function new_face ( vertex1, vertex2, vertex3, vertex4 )
// creates new face
{
	return new face ( vertex1, vertex2, vertex3, vertex4 );
}

function render_face ( face )
// renders face
{
	// apply matrix matrix
	tx1 = face.vertex1.x * matrix._11 + face.vertex1.y * matrix._21 + face.vertex1.z * matrix._31 + matrix._41;
	ty1 = face.vertex1.x * matrix._12 + face.vertex1.y * matrix._22 + face.vertex1.z * matrix._32 + matrix._42;
	tz1 = face.vertex1.x * matrix._13 + face.vertex1.y * matrix._23 + face.vertex1.z * matrix._33 + matrix._43;
	
	tx2 = face.vertex2.x * matrix._11 + face.vertex2.y * matrix._21 + face.vertex2.z * matrix._31 + matrix._41;
	ty2 = face.vertex2.x * matrix._12 + face.vertex2.y * matrix._22 + face.vertex2.z * matrix._32 + matrix._42;
	tz2 = face.vertex2.x * matrix._13 + face.vertex2.y * matrix._23 + face.vertex2.z * matrix._33 + matrix._43;
	
	tx3 = face.vertex3.x * matrix._11 + face.vertex3.y * matrix._21 + face.vertex3.z * matrix._31 + matrix._41;
	ty3 = face.vertex3.x * matrix._12 + face.vertex3.y * matrix._22 + face.vertex3.z * matrix._32 + matrix._42;
	tz3 = face.vertex3.x * matrix._13 + face.vertex3.y * matrix._23 + face.vertex3.z * matrix._33 + matrix._43;
	
	tx4 = face.vertex4.x * matrix._11 + face.vertex4.y * matrix._21 + face.vertex4.z * matrix._31 + matrix._41;
	ty4 = face.vertex4.x * matrix._12 + face.vertex4.y * matrix._22 + face.vertex4.z * matrix._32 + matrix._42;
	tz4 = face.vertex4.x * matrix._13 + face.vertex4.y * matrix._23 + face.vertex4.z * matrix._33 + matrix._43;
	
	face.vertex1.x += tx1;
	face.vertex1.y += ty1;
	face.vertex1.z += tz1;
	
	face.vertex2.x += tx2;
	face.vertex2.y += ty2;
	face.vertex2.z += tz2;
	
	face.vertex3.x += tx3;
	face.vertex3.y += ty3;
	face.vertex3.z += tz3;
	
	face.vertex4.x += tx4;
	face.vertex4.y += ty4;
	face.vertex4.z += tz4;
	
	moveTo ( translate_x ( face.vertex1.x, face.vertex1.z ), translate_y ( face.vertex1.y, face.vertex1.z ) );
	lineStyle ( );
	beginFill ( face.color );
	lineTo ( translate_x ( face.vertex2.x, face.vertex2.z ), translate_y ( face.vertex2.y, face.vertex2.z ) );
	lineTo ( translate_x ( face.vertex3.x, face.vertex3.z ), translate_y ( face.vertex3.y, face.vertex3.z ) );
	lineTo ( translate_x ( face.vertex4.x, face.vertex4.z ), translate_y ( face.vertex4.y, face.vertex4.z ) );
	lineTo ( translate_x ( face.vertex1.x, face.vertex1.z ), translate_y ( face.vertex1.y, face.vertex1.z ) );
}

cam = new camera ( 0, 0, 10, 100 );

matrix = new matrix ( );

face = new face ( new_vertex ( -20, -20, 0 ), new_vertex ( 20, -20, 0 ),
new_vertex ( 20, 20, 0 ), new_vertex ( -20, 20, 0 ) );

this.onEnterFrame = function ( )
// called repeatedly
{
	// clear screen
	clear ( );
	
	cam.x += _xmouse;
	cam.z += _ymouse;

	// translate
	translate ( matrix, cam.x, cam.y, cam.z );
	
	// render face
	render_face ( face );
}

Das funktioniert soweit, aber irgendwie bewegt sich der Face nicht nach der Mausposition, sondern schiebt sich nur direkt nach dem Start des Movies in eine Richtung (so wie die Maus in diesem Moment positioniert ist) und bleibt dort fest. Wieso bewegt der Face sich nicht weiter? OnFrameEnter wird doch wiederholend ausgeführt, oder?

Danke im Vorraus!

EDIT: Hat sich erledigt, ich hab's rausgefunden...
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück