 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Thorben
Anmeldungsdatum: 26.04.2005 Beiträge: 173 Wohnort: SH
|
Verfasst am: 01.07.2007, 11:45 Titel: Rotations Funktion |
|
|
Hallo,
ich brauche eine Funktion die einen Objekt um eine Achse drehen kann.
Ich hab eine Funktion geschrieben, die das Objekt aber nur um die Xachse dreht.
Code: |
'===========================================================================
FUNCTION TDRotatex( CtrPnt AS TYPE_3DVektor , RotPnt AS TYPE_3DVektor , Rota AS SINGLE = 1 ) AS TYPE_3DVektor
'===========================================================================
DIM NewPnt AS TYPE_3DVektor
DIM Radius AS SINGLE
DIM Winkel1 AS SINGLE
DIM Winkel2 AS SINGLE
Radius = SQR( ( CtrPnt.x - RotPnt.x ) * ( CtrPnt.x - RotPnt.x ) + ( CtrPnt.z - RotPnt.z ) * ( CtrPnt.z - RotPnt.z ) )
IF Radius <> 0 THEN
Winkel1 = ( ACOS( ( RotPnt.x - CtrPnt.x ) / Radius ) )
Winkel2 = ( ASIN( ( RotPnt.z - CtrPnt.z ) / Radius ) )
IF Winkel2 < 0 THEN
Winkel1 = ABS( Winkel1 / deg2rad - 360 )
ELSE
Winkel1 = Winkel1 / deg2rad
END IF
NewPnt.x = ( COS( ( Winkel1 + Rota ) * deg2rad ) * Radius ) + CtrPnt.x
NewPnt.y = RotPnt.y
NewPnt.z = ( SIN( ( Winkel1 + Rota ) * deg2rad ) * Radius ) + CtrPnt.z
ELSE
NewPnt = RotPnt
END IF
RETURN NewPnt
END FUNCTION
|
Durch diese Funktion würde ich jeden Punkt( RotPnt ) des OBjekts laufen lassen und mit eienem Winkel von "Rota" um den Punkt "CtrPnt" drehen. Als Rückgabewert erhalte ich dann die neue Position von "RotPnt".
Ist diese Funktion zuverlässig? oder habt ihr eine bessere Idee bzw optiemierungs vorschläge.
MFG Thorben |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.07.2007, 12:29 Titel: |
|
|
wenn es dir nicht ums selbstschreiben geht, kannst du auch mal MultiPut anschauen, das ist ziemlich gut  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Thorben
Anmeldungsdatum: 26.04.2005 Beiträge: 173 Wohnort: SH
|
Verfasst am: 01.07.2007, 12:49 Titel: |
|
|
Ich hab vergessen zu sagen, dass ich die neuen Punkte brauch.
Also das objekt soll nicht nur gedreht werden sondern ich benötige auch die neuen Koordinaten. Ansonsten könnte ich ja auch die OpenGL Funktion "glRotatef" benutzen.
MFG Thorben |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 01.07.2007, 12:56 Titel: |
|
|
Ich habe da vor laengerer Zeit mal ein kleinen Versuch gemacht, vielleicht hilft es Dir irgendwie weiter...
Code: |
declare sub set_vertex (x as short, y as short, z as short)
declare sub set_surface (p1 as ushort, p2 as ushort, p3 as ushort)
const DegRad = 3.14159265358979323/180
const focus = 180
const midx = 400
const midy = 300
type vertex_
as short x,y,z
end type
type surface_
as ushort p1,p2,p3
end type
dim shared vertex(999) as vertex_
dim shared surface(999) as surface_
dim shared vcnt as uinteger
dim shared tricnt as uinteger
sub set_vertex (x as short, y as short, z as short)
vertex(vcnt).x=x
vertex(vcnt).y=y
vertex(vcnt).z=z
vcnt=vcnt+1
end sub
sub set_surface (p1 as ushort, p2 as ushort, p3 as ushort)
surface(tricnt).p1=p1-1
surface(tricnt).p2=p2-1
surface(tricnt).p3=p3-1
tricnt=tricnt+1
end sub
'*****---set_vertex----set_surface-------------------------------------------------------------------------------------'
'' create obj3d (quader 100x100x100 vertex=8 surface=12)
'' set_vertex (vertex position x,vertex position y,vertex position z)
set_vertex (-50,-50,-50) 'vertex 1 to..
set_vertex (-50,-50, 50) ' ..2..
set_vertex ( 50,-50, 50) ' ..3..
set_vertex ( 50,-50,-50) ' ..4..
set_vertex (-50, 50,-50) ' ..5..
set_vertex (-50, 50, 50) ' ..6..
set_vertex ( 50, 50, 50) ' ..7..
set_vertex ( 50, 50,-50) ' 8
'' surface (triangle)
'' set_surface (vertex 1, vertex 2, vertex 3)
set_surface (1,2,3)
set_surface (1,4,3)
set_surface (1,5,4)
set_surface (5,8,4)
set_surface (4,3,8)
set_surface (8,7,3)
set_surface (7,6,3)
set_surface (6,2,3)
set_surface (1,2,5)
set_surface (5,6,2)
set_surface (5,8,7)
set_surface (7,6,5)
'' - - end create - -
'---------------------------------------------------------------------------------------------------------------------'
declare sub draw_object (byval raxis as short,byval angle as short,byval zoom as short)
enum
NONE = 0
XAXIS = 1
YAXIS = 2
' XYAXIS = 3
ZAXIS = 4
' XZAXIS = 5
' YZAXIS = 6
' XYZAXIS = 7
end enum
screen 19,24,2
dim shared as ubyte _edit
dim shared as ubyte _view
_edit=0 : _view=1
sub draw_object (byval raxis as short,byval angle as short,byval zoom as short)
screenset _edit
cls
'for study
for y=0 to 59
for x=0 to 79
line (0+(x*10),0+(y*10))-(9+(x*10),9+(y*10)),&h66,b
next x
next y
line (0,midy)-(799,midy),&hff
line (midx,0)-(midx,599),&hff
'end for study
for pnt=0 to tricnt
xpoint1 = vertex(surface(pnt).p1).x
ypoint1 = vertex(surface(pnt).p1).y
zpoint1 = vertex(surface(pnt).p1).z
xpoint2 = vertex(surface(pnt).p2).x
ypoint2 = vertex(surface(pnt).p2).y
zpoint2 = vertex(surface(pnt).p2).z
xpoint3 = vertex(surface(pnt).p3).x
ypoint3 = vertex(surface(pnt).p3).y
zpoint3 = vertex(surface(pnt).p3).z
select case raxis
case XAXIS
yypoint1 = ypoint1 * SIN(DEGRAD * angle) + zpoint1 * COS(DEGRAD * angle)
zzpoint1 = ypoint1 * COS(DEGRAD * angle) - zpoint1 * SIN(DEGRAD * angle)
ypoint1 = yypoint1 : zpoint1 = zzpoint1
yypoint2 = ypoint2 * SIN(DEGRAD * angle) + zpoint2 * COS(DEGRAD * angle)
zzpoint2 = ypoint2 * COS(DEGRAD * angle) - zpoint2 * SIN(DEGRAD * angle)
ypoint2 = yypoint2 : zpoint2 = zzpoint2
yypoint3 = ypoint3 * SIN(DEGRAD * angle) + zpoint3 * COS(DEGRAD * angle)
zzpoint3 = ypoint3 * COS(DEGRAD * angle) - zpoint3 * SIN(DEGRAD * angle)
ypoint3 = yypoint3 : zpoint3 = zzpoint3
case YAXIS
xxpoint1 = zpoint1 * SIN(DEGRAD * angle) + xpoint1 * COS(DEGRAD * angle)
zzpoint1 = zpoint1 * COS(DEGRAD * angle) - xpoint1 * SIN(DEGRAD * angle)
xpoint1 = xxpoint1 : zpoint1 = zzpoint1
xxpoint2 = zpoint2 * SIN(DEGRAD * angle) + xpoint2 * COS(DEGRAD * angle)
zzpoint2 = zpoint2 * COS(DEGRAD * angle) - xpoint2 * SIN(DEGRAD * angle)
xpoint2 = xxpoint2 : zpoint2 = zzpoint2
xxpoint3 = zpoint3 * SIN(DEGRAD * angle) + xpoint3 * COS(DEGRAD * angle)
zzpoint3 = zpoint3 * COS(DEGRAD * angle) - xpoint3 * SIN(DEGRAD * angle)
xpoint3 = xxpoint3 : zpoint3 = zzpoint3
case ZAXIS
xxpoint1 = ypoint1 * SIN(DEGRAD * angle) + xpoint1 * COS(DEGRAD * angle)
yypoint1 = ypoint1 * COS(DEGRAD * angle) - xpoint1 * SIN(DEGRAD * angle)
xpoint1 = xxpoint1 : ypoint1 = yypoint1
xxpoint2 = ypoint2 * SIN(DEGRAD * angle) + xpoint2 * COS(DEGRAD * angle)
yypoint2 = ypoint2 * COS(DEGRAD * angle) - xpoint2 * SIN(DEGRAD * angle)
xpoint2 = xxpoint2 : ypoint2 = yypoint2
xxpoint3 = ypoint3 * SIN(DEGRAD * angle) + xpoint3 * COS(DEGRAD * angle)
yypoint3 = ypoint3 * COS(DEGRAD * angle) - xpoint3 * SIN(DEGRAD * angle)
xpoint3 = xxpoint3 : ypoint3 = yypoint3
end select
xp1 = xpoint1 * FOCUS / (FOCUS - zpoint1) + midx
yp1 = ypoint1 * FOCUS / (FOCUS - zpoint1) + midy
xp2 = xpoint2 * FOCUS / (FOCUS - zpoint2) + midx
yp2 = ypoint2 * FOCUS / (FOCUS - zpoint2) + midy
xp3 = xpoint3 * FOCUS / (FOCUS - zpoint3) + midx
yp3 = ypoint3 * FOCUS / (FOCUS - zpoint3) + midy
line (xp1,yp1)-(xp2,yp2),&hffaa00
line (xp2,yp2)-(xp3,yp3),&hffaa00
line (xp3,yp3)-(xp1,yp1),&hffaa00
next pnt
swap _edit,_view
end sub
do
draw_object (yaxis,rotate,0)
screenset ,_view
if multikey(&h4b) then rotate=rotate-5 : if rotate <0 then rotate=rotate+360
if multikey(&h4d) then rotate=rotate+5 : if rotate >359 then rotate=rotate-360
loop until inkey$=chr$(27)
|
_________________
 |
|
Nach oben |
|
 |
Thorben
Anmeldungsdatum: 26.04.2005 Beiträge: 173 Wohnort: SH
|
Verfasst am: 01.07.2007, 15:41 Titel: |
|
|
Danke!
Mal sehen ob es mir was nützt ich erhalte nemlich bei meiner Funktion ab und zu sehr ungewöhnliche Werte sodas die Objekte sehr komisch aussehen^^.
MFG Thorben |
|
Nach oben |
|
 |
Thorben
Anmeldungsdatum: 26.04.2005 Beiträge: 173 Wohnort: SH
|
Verfasst am: 01.07.2007, 21:31 Titel: |
|
|
Danke die Funktion ist sehr gut
Aber wie schaff ich es die Funktionen so umzudrehen das sich das Objekt gegen den Uhrzeigersinn dreht wenn ich der Funktion als Winkel z.B. 45 Grad
übergebe?
MFG Thorben
/edit:
So hab ich die Funktion modifieziert:
Code: |
'===========================================================================
FUNCTION TDRotatez( CtrPnt AS TYPE_3DVektor , RotPnt AS TYPE_3DVektor , Rota AS SINGLE = 1 ) AS TYPE_3DVektor
'===========================================================================
DIM NewPnt AS TYPE_3DVektor
RotPnt = TDMatrixSub( RotPnt , CtrPnt )
NewPnt.x = RotPnt.y * SIN( deg2rad * Rota ) + RotPnt.x * COS( deg2rad * Rota ) + CtrPnt.x
NewPnt.y = RotPnt.y * COS( deg2rad * Rota ) - RotPnt.x * SIN( deg2rad * Rota ) + CtrPnt.y
NewPnt.z = RotPnt.z + CtrPnt.z
RETURN NewPnt
END FUNCTION
|
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 01.07.2007, 21:46 Titel: |
|
|
Thorben hat Folgendes geschrieben: | So hab ich die Funktion modifieziert:
Code: |
'===========================================================================
FUNCTION TDRotatez( CtrPnt AS TYPE_3DVektor , RotPnt AS TYPE_3DVektor , Rota AS SINGLE = 1 ) AS TYPE_3DVektor
'===========================================================================
DIM NewPnt AS TYPE_3DVektor
RotPnt = TDMatrixSub( RotPnt , CtrPnt )
NewPnt.x = RotPnt.y * SIN( deg2rad * Rota ) + RotPnt.x * COS( deg2rad * Rota ) + CtrPnt.x
NewPnt.y = RotPnt.y * COS( deg2rad * Rota ) - RotPnt.x * SIN( deg2rad * Rota ) + CtrPnt.y
NewPnt.z = RotPnt.z + CtrPnt.z
RETURN NewPnt
END FUNCTION
|
| Die Funktion wäre schneller, wenn du einführst: Code: | Dim RotaRad=deg2rad * Rota | Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|