Page 1 sur 1
[RESOLU] Focale : Bug ou pas bug ? -> pas Bug XD
Publié : dim. 01/sept./2013 20:52
par Jenova
Salut tout le monde, aujourd'hui j'ai décidé de jouer un peu avec la 3D de purebasic et je me suis cassé une canine sur la focale.
Je vous met en place le test.
- Je prend une résolution de 1920x1080
- je crée un objet plain de 1920x1080
- je choisi une focale de 60 degré
avec Pythagore je calcule le recul nécessaire de la camera pour que l'objet prenne 100% de l'écran, d'après mes calculs la camera devrai reculer de 1662.77 or à cette distance l'objet est beaucoup trop loin.
En avançant la camera manuellement il me faut aller à une distance de 935 pour que l'objet prenne 100% de l'écran ce qui représente une focale de 91.512 degré contre les 60 demandés
Quel est le problème ? Si vous avez des suggestions je suis preneur, si on ne peu pas se positionner mathématiquement ça crains

Re: Focale : Bug ou pas bug ?
Publié : dim. 01/sept./2013 21:01
par G-Rom
Salut , tu as du code ?
Re: Focale : Bug ou pas bug ?
Publié : dim. 01/sept./2013 21:08
par Jenova
Code : Tout sélectionner
IncludeFile "Screen3DRequester.pb"
#CameraSpeed = 1
If InitEngine3D()
Add3DArchive("texture",#PB_3DArchive_FileSystem)
InitSprite()
InitKeyboard()
InitMouse()
AngleDeVision.f = 60; 60degré de focale... normalement, essayez avec 91.512
ResolutionPrevueDuJeux_X.f = 1920
ResolutionPrevueDuJeux_Y.l = 1080
If Screen3DRequester()
CreateMaterial(1, LoadTexture(1, "1.png"))
CreateCamera(1,0,0,100,100)
CameraFOV(1,60) ; oui oui je veux bien du 60
CameraRange(1,0,2000)
MoveCamera(1,0,0,((ResolutionPrevueDuJeux_X/2)/Tan(Radian(AngleDeVision/2)))*-1,#PB_Absolute)
CameraLookAt(1,0,0,0)
CreatePlane(1,1920,1080,1,1,1,1)
CreateEntity(1,MeshID(1),MaterialID(1),0,0,0)
RotateEntity(1,-90,0,0,#PB_Absolute)
AmbientColor(RGB(255, 255, 255))
KeyY = ((ResolutionPrevueDuJeux_X/2)/Tan(Radian(AngleDeVision/2)))*-1
Repeat
Screen3DEvents()
If ExamineMouse()
MouseX = -MouseDeltaX() * #CameraSpeed * 0.15
MouseY = -MouseDeltaY() * #CameraSpeed * 0.15
EndIf
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up)
KeyY - #CameraSpeed
Debug KeyY
ElseIf KeyboardPushed(#PB_Key_Down)
KeyY + #CameraSpeed
Debug KeyY
EndIf
EndIf
MoveCamera(1, KeyX, 0, KeyY,#PB_Absolute)
RotateCamera(1, MouseY, MouseX, 0, #PB_Relative)
RenderWorld()
Screen3DStats()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
Pour l'image prenez n'importe laquelle en png ça ferra l'affaire, le fichier Screen3DRequester.pb vient de la partie exemple inclu dans PB
Re: Focale : Bug ou pas bug ?
Publié : dim. 01/sept./2013 21:49
par comtois
Avec Ogre la focale est verticale.
http://www.ogre3d.org/tikiwiki/tiki-index.php?page=-FOV
[EDIT]
Le calcul serait donc
Code : Tout sélectionner
Height.f = 1080
Fov.f = 60
Distance.f = (Height/2.0)/Tan(Radian(Fov/2.0))
Debug Distance
Re: Focale : Bug ou pas bug ?
Publié : dim. 01/sept./2013 22:11
par G-Rom
Ta formule est fausse , base toi sur la resolution en Y et pas en X
edit: Comtois à tout dis. pense aussi a stocké le tout dans un float.
Re: Focale : Bug ou pas bug ?
Publié : dim. 01/sept./2013 22:14
par Jenova
Merci, vous êtes des as

Re: Focale : Bug ou pas bug ?
Publié : dim. 01/sept./2013 22:23
par falsam
Et comme ça c'est bon ?
Code : Tout sélectionner
Global CameraSpeed = 1
Global Width.i, Height.i, vFov.f, HFov.f, CamScale.f, CamX.f
InitEngine3D()
InitKeyboard()
InitSprite()
;Avec Ogre la focale est verticale
Width = 1920
Height = 1080
vFOV = 60
Camscale = Tan((vFov / 2 ) / 180 * #PI)
CamZ = Height/2/CamScale
window = OpenWindow(#PB_Any,0, 0, Width, Height,"FOV")
OpenWindowedScreen(WindowID(window), 0, 0, Width, Height)
Texture = CreateTexture(#PB_Any,512,512)
StartDrawing(TextureOutput(Texture))
Box(0,0,512,512,RGB(0, 0, 0))
Box(1,1,510,510,RGB(255, 216, 0))
StopDrawing()
Mesh = CreatePlane(#PB_Any, 1920, 1080, 1, 1, 1, 1)
Material = CreateMaterial(#PB_Any,TextureID(texture))
Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(material))
RotateEntity(Entity, 90, 0, 0, #PB_Absolute)
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraFOV(Camera, VFov)
While #True
Event = WindowEvent()
Select event
EndSelect
ExamineKeyboard()
; Touche Escape pour fermer l'application
If Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
Break
EndIf
If KeyboardPushed(#PB_Key_Up)
CamZ-CameraSpeed
Debug CamZ
ElseIf KeyboardPushed(#PB_Key_Down)
CamZ+CameraSpeed
Debug CamZ
EndIf
MoveCamera(camera, 0, 0, CamZ, #PB_Absolute)
CameraLookAt(camera,0,0,0)
; Affiche le rendu de la scène
ClearScreen(RGB(0, 0, 0))
RenderWorld()
FlipBuffers()
Wend
Re: Focale : Bug ou pas bug ?
Publié : lun. 02/sept./2013 12:48
par Jenova
Ouille, quel dommage, on dirait que ma chtite idée fonctionne pas
J'avais dans l'idée de remplacer les Sprites2D et 3D par des plains ou autres formes 3D sans profondeur dans ogre.
Je croyais qu'on pouvais verrouiller certains déplacement grâce à EntityAngularFactor(seule une rotation sur axe Z autorisée) et EntityLinearFactor (aucun mouvement sur axe Z autorisé pour s'assurer que les plains restent tous sur le même plan et ainsi conserver une détection de collision) ce qui aurais été génial

... de la 2D avec camera de recul (comme dans Rayman legend) avec possibilité d'ajouter facilement des effets de lumières, des particules, de la physique façon Box2D, des déformations de sprites grâce à leur maillage 3D, des animations par bones etc... le pied quoi
Mais ça ne fonctionne pas, les deux commandes citées plus haut restent sans effet lors des déplacements automatisées.
Si vous prenez l'exemple plus haut, ou vous avez résolu mon soucis de focale (encore bravo, jamais je n'aurai imaginé une ouverture de focale verticale

) et que vous placez un autre objet plain au dessus avec les body qui vont bien et que vous laissez faire la gravité (préférez une faible gravité sans quoi on ne s’aperçoit même pas du contacte) l'objet du dessus va descendre jusqu’à toucher l'objet du dessous (ce qui va le stopper une seconde) et suite à ce contacte l'objet du dessus va se décaler sur l'axe Z de zéro virgule pas grand chose (malgré mon EntityLinearFactor qui lui dit <<pas bouger!>>) et poursuivre ça chute infernale grrrr mais pourquoi est-il aussi méchant ?!??
Re: Focale : Bug ou pas bug ?
Publié : lun. 02/sept./2013 14:18
par Fred
Re: Focale : Bug ou pas bug ?
Publié : lun. 02/sept./2013 15:36
par Jenova
Merci,
je viens de zieuter les codes, le dernier exemple génère des erreurs mais en regardant de plus près il me semble qu'au final, on restitue des sprites avec ogre mais qu'ils ne bénéficient pas de la gestion physique (gravité/poussée/transmission de forces etc...) quasi automatique calculée par RenderWorld() exploitant un body avec les entity, je me trompe ?
En tout cas c'est intéressant.
Edit: Bon je vais laisser tomber les fonctions de physique automatisées et utiliser des détections de collisions 3D associées à une gestion de la physique basique (poussée, gravité, friction) programmée avec les coudes, cela me permettra de faire suivre tout reliefs 3D et de se reposer dessus comme si on gérai de la 2D classique. J'ai testé ça fonctionne plutôt bien. Je pourrais conserver du coup Ogre et les déplacements de vue par camera, les couleurs et autres effets visuels propre à la 3D. C'est déjà assez sympa comme ça

mais il va falloir que je repense totalement mon éditeur de Map initialement prévu pour de la 2D/Tile classique (j'en suis déjà tout excité

)