Seite 1 von 1
IrrLicht3D , Node ausrichten
Verfasst: 25.12.2007 09:31
von tft
Hallo ...
weis einer wie ich mit Irrlicht eine SceneNode auf einen punkt im 3D Raum ausrichten kann?
MfG TFT
Verfasst: 29.12.2007 21:27
von Max_der_Held
hm.. bei OPEN Gl hats mal nen befehl gegeben, der die camera dreht... wenn man des umschreibt, könnte man die entstehende formel zum drehen vom OBjekt hernehmen.. viel spaß :ironie:
Code: Alles auswählen
piover180.f = (ATan(1)*4)/180
gluLookAt__(-CameraX, -CameraY, -CameraZ, -(CameraX + Sin(CamrotY*piover180)*10), 0, -(CameraZ + Cos(CamrotY*piover180)*10)+1, 0.0, 1.0, 0.0)
beschreibung des befehls (alles aus nem opengl tutorial):
- ; Mit gluLookAt definieren wir den Standort der Sicht. Die ersten drei Parameter sind die Position. Die zweiten drei ist die GuckPOSITION. Die dritten sind der UpVektor(fast immer 0.0, 1.0, 0.0)
mfg, max
- [EDIT] wenn du's mal irgendwie rauskriegst, dann postes bitte.. ich such sowas auch, eigentlich (laser-schuss-mesh in schussrichtung ausrichten)
[/edit]
Verfasst: 29.12.2007 22:00
von tft
Hi ...
danke für die Antwort... leider blicke ich da nicht durch .... mal sehen was ich draus machen kann.
Verfasst: 29.12.2007 22:22
von Thalius
Hier ne C++ Funktion - siehst mal die Mathe dahinter. Baue die noch ein ( einfachheitshalber ).... Aber irgendwo hatte ich das schon mal beantwortet hier... puh scheissgrippe .. immernoch schlepp ich die rum.
Code: Alles auswählen
; void faceTarget(irr::core::vector3df targetPos) {
; core::vector3df nodePos = targetPos - myNode->getPosition();
; myRotation.Y = ATan(nodePos.Z/nodePos.X) * (180.0f / irr::core::PI);
; If((targetPos.X - myNode->getPosition().X) > 0) {
; myRotation.Y = 90 - myRotation.Y;
; } Else If((targetPos.X - myNode->getPosition().X) < 0) {
; myRotation.Y = -90 - myRotation.Y;
; }
; myRotation.Y -= 90;
; myNode->setRotation(myRotation);
; }
vector3df = vector 3d float
resp. ( findest du im include file )
Damit sollts eigentlich einfach sein.
Neue Version wird noch n Command dazu kommen ( Geplant ist auch ein "Newbie" set das DarkBASIC alike simple ist... - aber erst mal muss ich etwas feddich kriegen - typisch widermal an 10 sachen dran hier
Falls partu ned weiterkommst schreib ichs um die Tage mal...
Thalius
Verfasst: 31.12.2007 18:18
von SirCus
gibts da nich schon ne Funktion? Hab da was in erinnerung. In der Hilfe war als Beispiel eine Rakete genannt, die sich aufs Ziel ausrichtet.. hab grad Irrlicht nich hier..
Verfasst: 31.12.2007 18:25
von Thalius
Yup für den Pitch:
** schnipp **
// Especially wanted from Xperience2003
// Usefull for all out there
// Author : Xaron
/**
* @brief guided missile steering helper function
*
* @param missilePosition - current absolute position of the missile
* @param missileRotation - current absolute rotation of the missile
* @param targetPosition - current absolute target position
* @param oversteer - oversteer factor in degrees
*
* @return targetPitchRoll - delta pitch (x) and delta roll (z) values to the target
*
Code: Alles auswählen
NAME
IrrGetToTargetPitchRoll -
SYNOPSIS
IrrGetToTargetPitchRoll(*sourceNode.l, *targetNode.l, *x.f, *y.f, *z.f)
INPUTS
*sourceNode.l - pointer to a Scene Node that act as Source (maybe the Rocket)
*targetNode.l - pointer to a Scene Node to point at (maybe a enemy)
*x.f,*y.f,*z.f - targetPitchRoll : delta pitch (x) and delta roll (z) values to the target
FUNCTION
guided missile steering helper function
EXAMPLE
IrrGetToTargetPitchRoll(*rocketNode,*destinationNode, @x.f,@y.f,@z.f )
RESULT
nothing
NOTES
This wraps a Method, found in the Irrlicht-Forum
Author of the Method is : Xaron
** schnapp **
Thalius
Verfasst: 09.01.2008 02:06
von Thalius
Und die C++ Funktion übersetzt:
IrrFaceTargetNode()
Siehe hier:
http://www.purebasic.fr/english/viewtopic.php?t=30500
Thalius
Verfasst: 26.04.2008 12:37
von D4uS1
Wenn ich das richtig vertsehe willst du das das Objekt in eine richtige Richtung schaut. Am besten du löst das ganze mit trigonometrie [cos, tan, sin] ( mach ich auch immer so ).
Bsp.
Code: Alles auswählen
Procedure.f Objektneigung(Bahn.f, StreckeX.f, StreckeY.f, StreckeZ.f, Achse.b)
If Achse = #ACHSE_X
ElseIf Achse = #ACHSE_Y
If StreckeZ < 0
ProcedureReturn (ACos(StreckeX/Bahn)*360)/(2*#PI)
Else
ProcedureReturn 360-(ACos(StreckeX/Bahn)*360)/(2*#PI)
EndIf
ElseIf Achse = #ACHSE_Z
EndIf
EndProcedure
Du musst die dementsprechenden Befehle für die anderen Achsen ergänzen, ich weiß ja nicht in welche Richtung dein Objekt standardmäßig schaut. Das hier ist nur ein Beispiel.
Bahn ist die Bahnegschwindigkeit, also im Grunde die Hypothenuse.
Und gib Acht, PB benutzt in Sachen Winkelberechnungen das Bogenmaß und Irrlicht das Gradmaß, man muss erst umrechnen.
lg
Andreas