Dreamotion3D

Généralités sur la programmation 3D
Anonyme

Message par Anonyme »

Pour la camera asservie au JoyPad, tu peux t'inspirer de ce qui est fait avec la souris dans les
samples du pack, ou elle suit le pointeur de la souris, parfaitement sur les deux axes fondamentaux.
le problème n'est pas là, imagine que je fasse un roll de 45° ensuite si je désire monter en altitude (pitch) , je dois "lever le manche", mais comme je suis à 45° est non pas 0 mon pitch devrais être perpendiculaire a mon axe d'avancé,j'aimerais modifier donc les angles locales aux mesh, et non pas globale au moteur.
je te fait un exemple simple & propre, j'espère que tu as un joystick ^^
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Les fonctions attendent une adresse ou un numéro ?
Exemple , avant dans tes exemples tu écrivais
Global *entity.Centity
DM_LoadEntity(*entity)
Maintenant dans la doc je vois
Global entity.l
DM_LoadEntity(entity)
Donc finalement, les fonctions attendent une adresse ou un numéro ?
Si c'est une adresse, dans ce cas il faut utiliser les pointeurs.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

@Cpl.Bator je vois en gros ton prob, mais il existate globalement deux fonctions
pour faire des rotations:
DM_RotateEntity() qui permet des rotations absolu
DM_TurnEntity() qui permet des rotations relative

@Comtois Les fonction attendent ou retournent toujours une adresse.
d'ailleurs si tu consulte le wrap (Dreamotion3d.pbi) il n'a pas changé. J'ai tenu compte des
remarques sur la lourdeur du code avec tous ces pointeurs. Donc en fait, les deux syntaxes
marchent de la meme manière, a chacun donc d'adopter la syntaxe qui lui plait.
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tmyke a écrit :@Comtois Les fonction attendent ou retournent toujours une adresse.
d'ailleurs si tu consulte le wrap (Dreamotion3d.pbi) il n'a pas changé. J'ai tenu compte des
remarques sur la lourdeur du code avec tous ces pointeurs. Donc en fait, les deux syntaxes
marchent de la meme manière, a chacun donc d'adopter la syntaxe qui lui plait.
oui mais attention, sur une machine 64 bits est-ce que ça fonctionnera si tu stockes une adresse dans un long ?
Autant prendre les bonnes habitudes, et utiliser un pointeur pour représenter une adresse.

A moins que le long de PB soit toujours de la taille d'une adresse, autrement dit 64 bits dans les versions 64 bits ?

Je te conseille de conserver la syntaxe avec le pointeur pour éviter les ambiguïtés.

les structures sont vides dans le fichier dreamotion3D, il y a des données qui seraient intéressantes à récupérer directement via le pointeur ou il est préférable de toujours passer par les fonctions de dreamotion3D ?
Par exemple tu as mis la structure des particules, parce qu'on agit directement dessus(init de l'émetteur), et pour les autres objets 3D ?

**************Autre question****************
Dans dreamotion3d je vois default=Pi/4.0
DM_CameraZoom(*Camera.CEntity, zoom.f) ; default=Pi/4.0

Tu n'avais pas dit que toutes les fonctions attendaient des degrés ?
Il me semble que cette fonction travaille en radian ?

J'ai du mal à trouver les bonnes valeurs pour faire un zoom.
Cpl_bator avait mis 100 pour zoomer et 120 pour l'affichage normal.
Le problème c'est que si tu vas progressivement de 100 à 120 tu vois le modèle s'afficher à l'envers, comme si on était en radian et qu'on faisait plusieurs fois le tour du cadran.

Pourrais-tu m'indiquer quelles valeurs mettre pour un affichage normal, et pour faire un zoom ? de façon à passer progressivement de l'un à l'autre ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Pour la syntaxe sur les pointeur tu as certainement raison, avec les adressage qui ne
feront qu'augmenter, il parait plus sage de rester sur la syntaxe pointeur.

Pour l'histoire du zoom, je teste et je te dis ce qu'il en est ...
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai modifié le code de cpl_bator comme ça pour tester

Code : Tout sélectionner

  If MouseButton(#PB_MouseButton_Right)
    Zoom = CurveValue(Zoom, 100, 100)  
  Else
    Zoom = CurveValue(Zoom, 120, 100)  
  EndIf
  
  DM_CameraZoom(*camera,zoom)
Avec

Code : Tout sélectionner

Procedure.f  CurveValue(actuelle.f, Cible.f, P.f) 
  Define.f Delta, Valeur
  
  Delta = Cible - actuelle 
  If P > 1000 : P = 1000 : EndIf 
  Valeur = actuelle + ( Delta * P / 1000) 
  ProcedureReturn Valeur 
EndProcedure 
Et ne pas oublier de changer la déclaration de zoom

Code : Tout sélectionner

Global zoom.f
[EDIT]

Ok j'ai trouvé le bon réglage

Code : Tout sélectionner

  If MouseButton(#PB_MouseButton_Right)
    Zoom = CurveValue(Zoom, -#PI/6.0, 100)  
  Else
    Zoom = CurveValue(Zoom, #PI/6.0, 100)  
  EndIf
  
  DM_CameraZoom(*camera,zoom)
il faut utiliser des valeurs négatives et c'est bien des radians, il faudra que je compare avec Ogre ce que ça donne de mettre un angle en négatif, je crois bien que je n'ai jamais fait l'essai.
Dernière modification par comtois le mer. 08/nov./2006 20:56, modifié 1 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Pour le zoom, ne tiens pas compte de la valeur 'PI/4' qui est par erreur en commentaire dans
le fichier *.pbi.

La valeur a fournir n'est pas un angle, mais une profondeur de champs.

En fait, il s'agit d'un float (et non un entier), et si tu ecrit la routine comme:

Code : Tout sélectionner

zoom.f = 100.0
...
if(Key_machin_tapuis)
 zoom = zoom + 0.01
 DM_CameraZoom(*camera, zoom)
endif
Alors ton zoom sera progressif... (exemple aussi dans sample du pack '3D2D.pb'

;)
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

oups je n'avais pas vu que tu avais répondu.
Finalement les valeurs vont de combien à combien ? valeur mini , valeur maxi ?

Enfin, comme je disais plus haut j'ai trouvé le bon réglage, sauf que ça ne sert à rien de parler d'angle :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Anonyme

Message par Anonyme »

Code : Tout sélectionner

DM_RotateEntity() qui permet des rotations absolu
DM_TurnEntity() qui permet des rotations relative 
Oui , j'ai déjà tester ces deux fonctions, mais ca ne regle pas le problème d'angle, je continue le code, et je te le file pour que tu comprennes mieux.

@++
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

@Cpl.Bator Ok, je verais mieux avec ton code

@Comtois la valeur mini est 0. MAxi, y'en a pas, au coder de voir selon leur
emploi de la fonction quel valeur max il est bon d'avoir...
Force et sagesse...
Anonyme

Message par Anonyme »

A 130 le champ de vision (fustrum?) se retourne.
Anonyme

Message par Anonyme »

File:1->Angle.rar
Image

Voilà mon problème un peu plus imagé :D
Essaye de jouer au pilote avec un controle pareil ^^

Je crois avoir trouvé des lacunes au niveau des pivots, j'ai voulu dabord creer un "vaisseau" a base de cones et de sphere, et leur donner un point de pivot global pour les rotations, mais cela n'avait aucun effet.
En fait les angles du mesh sont relatifs au angles global du monde 3D

Se genre de commande serais la bienvenue :

Dm_SetMeshYaw()
Dm_SetMeshRoll()
Dm_SetMeshPitch()

je ne sais pas si on ta fait la requete, mais des commandes du style serais la bienvenue aussi :

DM_CameraLookAt()
DM_CameraFollowMesh(*Cam,*Mesh,Distance,Height)

et un peu plus de liberté dans la création de mesh standard comme les cylindre les cones, etc... (au niveau des paramètres, hauteur,largeur,etc..)

Promis, demain je ne t'embête plus ^^
bebou007
Messages : 79
Inscription : dim. 06/mars/2005 20:18

Message par bebou007 »

salut a tous voila j'ai un petit probleme j'essay de faire passer dm3d sur playbasic j'ai donc un petit probleme un petit bout de code simple juste pour tester au moin si sa tourne

voila mon code

Code : Tout sélectionner


; PROJECT : 3d
; AUTHOR  : beb
; CREATED : 09/11/2006
; EDITED  : 09/11/2006
; ---------------------------------------------------------------------

#Include "Dreamotion3D"


hWnd = GetScreenHandle()

OpenScreen 800,600,32 ,2

DM_InitGraphics(hWnd, 32, 2 ,1)


Repeat
	
	
	
	
	DM_BeginScene()
	DM_RenderWorld()
   DM_EndScene()
Until SpaceKey()



et quand je lance se code il me sort un message erreur venant apparrament du moteur

en titre "terrain"

et en texte "createdevice failed"

donc etant donner que tu a programmer le moteur tu devrais pouvoir m'aider


merci
Anonyme

Message par Anonyme »

remplace

DM_InitGraphics(hWnd, 32, 2 ,1)

par

DM_InitGraphics(hWnd, 32, 1 ,1)

@++
Anonyme

Message par Anonyme »

ha , j'oubliais

tu demande un hwnd avant d'ouvrir un ecran

hWnd = GetScreenHandle()
OpenScreen 800,600,32 ,2

inverse

OpenScreen 800,600,32 ,2
hWnd = GetScreenHandle()

@++
Répondre