| |||||
| Dernière réponse | |
|---|---|
| Sujet : D3D : y a ti bien qqun ki va m'aider . | |
| MrX | Ben merci les gars , au plaisir :hello: :jap: |
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| MrX | Ben merci les gars , au plaisir :hello: :jap: |
| youdontcare | :) pour 800f tu n'auras pas la version entreprise, donc pas mal de features en moins. je me souviens plus vraiment de la différence ... tiens, une url sympa : http://www.joelonsoftware.com un ex-gars de krosoft qui raconte ses vues sur la programmation, il a monté une boîte et codé un logiciel vb + interactions ocx/activex pour les composants qui devaient être rapides. tu apprendras beaucoup sur ce site & sur son forum. les exemples vb sdk sont fluides, je ne sais pas trop quoi te dire à part de les regarder plus en détail :D ... ocx/ole/activex/com, tout ça j'étais passé à côté aussi, ce qui est bien dommage avec le recul. tu peux créer un composant c++ qui s'occupe dans ton cas de déterminer quel vertices sont sélectionnées et le faire interagir avec ton code. tu peux ensuite l'insérer dans une page web, dans word, powerpoint ... partout partout. ok pour déterminer une sélection de vertices ce n'est pas très utile, mais ça te donne une idée des possibilités. |
| Jcom | j'crois que le mieux c enocre que t'achète le hors série de pc-team (non non g pas d'action chez eux) sur le c++. t'as la version introductory de vc++ avec et ca doit couter dans les 40 boules à tout péter :D Le seul problème c que qu'en tu fait un prog avec et que tu l'executes, t'as un message qui dit que tu peut pas vendre ton prog, etc... mais bon c facile de changer le txt en bidouillant :lol:
et après tu peut dire :fuck: krosoft |
| MrX | Ca devrait etre imminent , packe j'ai monté un ch'tit prog ki me permet de loadé plein d'objet 3d tout comme je veux (un erzatz de log 3d) . quand je suis à + de 200 vertices , ca fait mal au crane (juste le repere , y en a pour 60 vertices...) . Y parait ke c'est facile de passer d'un language à un autre tant k'on un certain passer . pirater c++ > Ben tu crois ke j'ai eu vb comment... Sauf ke c'est un pote ki ma l'a graver , alors ke j'en connais pas ki ai VC . Sinon c'est 800 boules la verison normale à couf... ca vaut le coup ? OCX> c'etait une partie du tutorial ke j'aivais sauté packe j'etait préssé , mais p'tet ben ke je vais me pencher plus dessus . C'est clair ke ca code super vite sur VB . J'ai fait des soft ki repertories les composants electroniques et fait certian calcul pour la boite à mon pere en un rien de tant . Mais y a du chemin à faire sur le coter graphique . Pourtant les sample VBsdk sont fluides... |
| youdontcare | ok ! :)
vb est un langage interprété je crois, ou compilé ... enfin le langage en lui-même fait qu'il est plus lent que des languages plus bas niveau comme le C. le vb, d'après ce que j'en entends, est un très bon langage pour développer des applications facilement et rapidement. si tu as besoin d'optimiser des bouts de code trop lents, le plus simple est de faire des contrôles ocx/activex codés en C++ et interfacés avec VB. yep, vc++ est cher. tu dois pouvoir trouver une version étudiante plus abordable. tu peux aussi le pirater. oui, je sais, c'est mal. tout du moins en théorie, tu te formes avec 'gratuitement' et lorsqu'on t'embauche tu connais déjà le compilo standard, la boîte t'en achète une licence, et hop. microsoft est content car ils en ont vendu un de plus, la boîte est contente car elle n'a pas eu à investir en formation. etc. enfin pour le moment je te conseillerais plutôt de bien te perfectionner en vb/3d et de ne passer au C/C++/autre que lorsque tu seras vraiment bloqué (genre 30 secondes pour faire un pick avec un objet de 30 faces :D) |
| MrX | vivi ca marche :D :sol: euh part contre , ce ke tu viens de m'expliquer pour fluidifier , en fait j'ai un peu pas compris , enfin pour pas dire ke tu m'as enchainer... En koi c/c++ c'est mieux ? J'ai deja essayer avec le compileur gratos mais c'est trop chiant . Le visual il est mieux mais il est chero , snif ! |
| youdontcare | euh, ça marche au moins ? :D :??:
pour fluidifier le tout, une des solutions est de passer en c/c++. sinon tu peux essayer de ranger tes objets dans un octree, faire un rendu dans un deuxième buffer en associant une couleur par objet et tester quelle couleur renvoie le pointeur de la souris, etc. |
| MrX | :jap: je m'incline devant tant de savoir . Je te remercie de t'etre fait chier à m'aider... Dit , tant ke je t'ai sous la souris , comment tu fais pour fluidifier le schmilblic , packe ca ram dur malgrés ma config :( |
| MrX | kel queue , z'avait po vu ! :D . Mouarf !! ben je pratique et je reviens ! |
| youdontcare |
pas la peine de chercher plus loin je pense. tu dois calculer de nouvelles coordonnées à partir d'un point existant, ta méthode actuelle foire la transformation. essaye, tu obtiendras des résultats différents juste en changeant l'ordre des lignes.
|
| MrX | ouais mais c'est le sdk pour C , pas VB .
Tu veux mon code , ben vala , mais pleurs pas si c'est long... Dim i As Long Private Type POINTAPI X As Single Y As Single End Type Dim Xx As Single Dim Yy As Single Dim Zz As Single Dim Tt As Single Dim aXx As Single Dim aYy As Single Dim aZz As Single Dim aTt As Single Dim mop As POINTAPI Dim mop1 As POINTAPI Dim mop2 As POINTAPI Dim mop4 As POINTAPI Dim mop5 As POINTAPI Dim dx As New DirectX8 Dim drd As Direct3D8 Dim dev As Direct3DDevice8 Dim d3dpp As D3DPRESENT_PARAMETERS Dim mode As D3DDISPLAYMODE Dim cnt As Long Dim cap As D3DCAPS8 Dim d3dx As New D3DX8 Const VT = (D3DFVF_XYZ Or D3DFVF_DIFFUSE) Private Type VertType p As D3DVECTOR color As Long End Type Dim OrthoVert() As VertType Dim D3dVert As Direct3DVertexBuffer8 Dim Vers As Long Dim Shapes() As Long Dim NB As Long Dim a() As Single Dim NbOfSets As Long Dim mat11 As D3DMATRIX Dim mat9 As D3DMATRIX Dim mat10 As D3DMATRIX Dim mat6 As D3DMATRIX Dim mat8 As D3DMATRIX Dim mat7 As D3DMATRIX Dim mat4 As D3DMATRIX Dim mat5 As D3DMATRIX Dim mat1 As D3DMATRIX Dim mat2 As D3DMATRIX Dim mat3 As D3DMATRIX Private Sub Form_Load() NB = 80 Set drd = dx.Direct3DCreate() drd.GetAdapterDisplayMode D3DADAPTER_DEFAULT, mode d3dpp.Windowed = 1 d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC d3dpp.BackBufferFormat = mode.Format d3dpp.hDeviceWindow = Picture1.hWnd Set dev = drd.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Picture1.hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, d3dpp) dev.SetRenderState D3DRS_LIGHTING, 0 dev.SetRenderState D3DRS_CULLMODE, 2 NB = NoOfSets("Ortho.vrt" ) Reload_Click D3DXMatrixPerspectiveFovLH mat3, 0.5, 1, 1, 100 dev.SetTransform D3DTS_PROJECTION, mat3 D3DXMatrixLookAtLH mat2, Vec3(0, 0, -20), Vec3(0, 0, 0), Vec3(0, 1, 0) dev.SetTransform D3DTS_VIEW, mat2 End Sub Private Sub Form_Unload(Cancel As Integer) Set dev = Nothing Set drd = Nothing Set D3dVert = Nothing End Sub Private Sub Picture1_KeyPress(KeyAscii As Integer) Select Case KeyAscii Case Is = 56 mop1.Y = mop1.Y + 4 Case Is = 50 mop1.Y = mop1.Y - 4 Case Is = 52 mop1.X = mop1.X + 4 Case Is = 54 mop1.X = mop1.X - 4 End Select End Sub Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) mop.X = X mop.Y = Y Mice If Button = 1 Then mop4.Y = mop4.Y + (mop.Y - mop2.Y) End If If Button = 2 Then mop5.Y = mop5.Y - (mop.Y - mop2.Y) mop4.X = mop4.X + (mop.X - mop2.X) End If mop2.X = X mop2.Y = Y End Sub Private Sub Reload_Click() Set D3dVert = Nothing OrthoSee NB = NoOfSets("Ortho.vrt" ) Set D3dVert = dev.CreateVertexBuffer(Vers * NB / 6, 0, VT, D3DPOOL_DEFAULT) D3DVertexBuffer8SetData D3dVert, 0, Vers * NB / 6 + 1, 0, OrthoVert(1) End Sub Private Sub Timer1_Timer() mat ComputePos Call Mice dev.Clear 0, ByVal 0, D3DCLEAR_TARGET, RGB(150, 125, 0), 0, 0 dev.BeginScene dev.SetStreamSource 0, D3dVert, Vers dev.SetVertexShader VT dev.DrawPrimitive D3DPT_LINELIST, 0, 29 dev.EndScene dev.Present ByVal 0, ByVal 0, 0, ByVal 0 End Sub Private Sub Mice() Label1.Caption = "Mouse X : " & mop.X & vbNewLine & "Mouse Y : " & mop.Y & vbNewLine & vbNewLine _ & mat10.m11 & vbNewLine & mat10.m12 & vbNewLine & mat10.m13 & vbNewLine & mat10.m14 & vbNewLine _ & vbNewLine & mat10.m21 & vbNewLine & mat10.m22 & vbNewLine & mat10.m23 & vbNewLine & mat10.m24 & vbNewLine _ & vbNewLine & mat10.m31 & vbNewLine & mat10.m32 & vbNewLine & mat10.m33 & vbNewLine & mat10.m34 _ & vbNewLine & vbNewLine & mat10.m41 & vbNewLine & mat10.m42 & vbNewLine & mat10.m43 & vbNewLine & mat10.m44 _ & vbNewLine & vbNewLine & "Computed pos : " & vbNewLine & "X : " & Xx & vbNewLine & "Y : " & Yy _ & vbNewLine & Zz & vbNewLine & vbNewLine & aXx & vbNewLine & aYy & vbNewLine & aZz & vbNewLine _ & vbNewLine & mat3.m11 & vbNewLine & mat3.m12 & vbNewLine & mat3.m13 & vbNewLine & mat3.m14 & vbNewLine _ & vbNewLine & mat3.m21 & vbNewLine & mat3.m22 & vbNewLine & mat3.m23 & vbNewLine & mat3.m24 & _ vbNewLine & vbNewLine & mat3.m31 & vbNewLine & mat3.m32 & vbNewLine & mat3.m33 & vbNewLine & mat3.m34 _ & vbNewLine & vbNewLine & mat3.m41 & vbNewLine & mat3.m42 & vbNewLine & mat3.m43 & vbNewLine & mat3.m44 End Sub Private Sub OrthoSee() ReDim OrthoVert(0) NbOfSets = NoOfSets("ortho.vrt" ) ReDim a(NbOfSets + 6) ReDim OrthoVert(1 To NbOfSets / 6 + 1) Open "Ortho.vrt" For Random Access Read Shared As #1 Len = 6 For i = 1 To NbOfSets + 6 Get #1, i, a(i) Next Close #1 For i = 1 To NbOfSets / 6 + 1 With OrthoVert(i): .p = Vec3(a(i * 6 - 5), a(i * 6 - 4), a(i * 6 - 3)): .color = RGB(a(i * 6), a(i * 6 - 1), a(i * 6 - 2)): End With Next Vers = Len(OrthoVert(1)) End Sub Private Function Vec3(X As Single, Y As Single, z As Single) As D3DVECTOR With Vec3: .X = X: .Y = Y: .z = z: End With End Function Private Sub mat() D3DXMatrixRotationX mat7, mop1.Y / 200 D3DXMatrixRotationY mat4, mop1.X / 200 D3DXMatrixTranslation mat1, mop4.X / 100, mop5.Y / 50, mop4.Y / 25 D3DXMatrixMultiply mat6, mat7, mat4 D3DXMatrixMultiply mat5, mat6, mat1 dev.SetTransform D3DTS_WORLD, mat5 End Sub Private Sub ComputePos() D3DXMatrixMultiply mat9, mat5, mat2 D3DXMatrixMultiply mat10, mat9, mat3 aXx = 0 aYy = 0 aZz = 0 aTt = 0 Xx = 0 Yy = 0 aXx = (aXx * mat10.m11) + (aYy * mat10.m21) + (aZz * mat10.m31) + mat10.m41 aYy = (aXx * mat10.m12) + (aYy * mat10.m22) + (aZz * mat10.m32) + mat10.m42 aZz = (aXx * mat10.m13) + (aYy * mat10.m23) + (aZz * mat10.m33) + mat10.m43 aTt = (aXx * mat10.m14) + (aYy * mat10.m24) + (aZz * mat10.m34) + mat10.m44 Xx = (aXx / aTt) Yy = (aYy / aTt) Zz = (aZz / aTt) Xx = Xx * Picture1.ScaleWidth + (0.5) * Picture1.ScaleWidth Yy = -1 * (Yy * Picture1.ScaleHeight - 0.5 * Picture1.ScaleHeight) End Sub |
| z51 | Dans le SDK de DirectX y'a un exemple de picking de faces. |
| youdontcare | balance ton code ici ou en private. |
| MrX | mouarf , y a pas ton mail ! |
| MrX | ben voila la preuve du contraire , enfin , je pense : Je t'ai mailé l'ebauche de mon programme . Tu y vera le coordonnées en temps réel de la souris et celle calculé avec ta formule pour l'origine du repére . Tu constatera que y a un décallage vers les poles . enfin tu vera... |
| LeGreg |
|
| youdontcare |
tu l'uploades sur un serveur. |
| MrX | merde le dessin n'est pas passé ! je fais comment pour foutre une image ? |
| MrX | a bon t'as jamais remarqué que y avait un décallage flagrant entre les coordonées que tu calcule , avec la méthode ke tu m'as montré , et les réelles quand tu fais une translation d'axe x ou y . c'est parce que d3d considére le plan et l'espace comme etant courbés . Donc quand ta primitive est au poles de ton ecran , x = x + x/cos(alpha) , ou x/cos(alpha) est le... enfin c'est dur à explicité mais p'tet ke ce dessin t'aidera :
http://localhost/espaceplan.bpm Ce que je cherche a calculé c'est le rayon de courbure de l'espace . |
| youdontcare | je ne comprends absolument rien à ce que tu racontes :( ... |
| MrX | mouarf ! En fait le décallage pendant les translations , j'ai emmérgé d'ou ca vient , c'est packe d3d considére l'espace comme une sphere , on a x = x + x/cos(alpha) avec alpha l'angle entre la tengeante et la corde au point x sur le cercle . Ca tu le sais deja mais c'etait pour te prouver ke j'ai un cerveaux , et pas k'une souris ! Mais pour avoir l'angle me faut le rayon de la shpere . Fait comment :??: |
| youdontcare | montre tout ton code VB ... on va voir si je comprends :D ;) |
| MrX | Dites , c'est vraiment mieux le C ? |
| MrX | non , pas grave , j'ai retappé ton truc en vb et ca marche . enfin a moitié seulement :
y a ca : sy = -1*(pp.y * scaleheight - .5 * scaleheight) et pis ca marche pour les translations sur tout les axes , mais y a un décallage en y et x d'environ x= x+ x/z et y= y- y/z . Et pis pour les tout ce qui rotation , quelque soit l'axe , ca foire à mort . ca donne un truc du genre x/(sin(x) * cos(x)) et meme chose pour y . Ta po un moyen de niquer ca ? |
| youdontcare | je ne vois pas comment faire plus simple que ce que j'ai marqué plus haut. de plus, je viens de mater le code de l'exemple de pick dans la sdk, que je trouve loin d'être insurmontable.
donc plutôt que de passer dix minutes à te détailler ça étape par étape, je vais te dire de chercher sur google.com : * un petit tutorial sur le C, ou le javascript * un autre sur les transformations 3D voilà. ça ne sert pas à grand chose d'essayer de comprendre du code si tu n'as pas encore appris les bases. |
| MrX | ben je dis sample avec code packe y avait a peu prés tout ton code ke je ne comprennai pas . Et va pas ma sortir ke c'est evident packe je peux te sortir du code en vb que t'aurai po plus compris , a moins ke t'es un passé en basic .
En ce ki concerne le copier coller , ne crois ke je voulais un sample pour faire ça , packe dans ce cas j'ai deja eesayé sur les sample fourni par Krosoft avec le runtime vb (ki marche d'ailleurs) . Mais il on des notations de pd , alors encore j'ai compris comment on fait pour les fonts ou les matrices , encore ca , po moyen , il pu trop leurs code . Et si je comprends pas , je peux pas aller plus loin . Bon je sais , je suis chiant , mais au lieu de me coller du C sur la guelle , tu peux plutot me foutre la formule mathématiques en bonne et du forme , ou m'explicité un peu plus tes notations . Je sais c'est lourd , mais m'en faut bocoup pour comprendre |
| youdontcare |
:jap: effectivement ... je continue à préférer une réponse style 'je comprends pas l'étape x au moment y' plutôt que 'je veux un sample avec du code'. |
| El_gringo |
|
| youdontcare |
:lol: tu ne sais vraiment pas lire du C ?
|
| MrX | ben merci les gars . sauf ke la tu m'as sorti du c et pi moi c'est du vb... ben y a l'esprit , c'est deja ca . mais z'avez un sample avec le code , pleaz . |
| bjone | :hello:
yeseu... mais d'oû l'intêret d'avoir une carte T&L qui fasse la projection pour toi, pour la refaire ensuite en VB :D :lol: [edtdd]--Message édité par bjone--[/edtdd] |
| youdontcare | chrisbk t'as dit comment faire dans l'autre topic. je détaille : tu définis une nouvelle matrice, localToScreen = world * view * proj tu multiplies les points de ton vertex buffer par cette matrice, tu as alors ton objet exprimé dans le repère de l'écran (les coordonnées sont homogènes). soit p un point du vertex buffer, pp le point projeté correspondant : pp.x = p.x * localToScreen[0][0] + p.y * localToScreen[1][0] + p.z * localToScreen[2][0] + localToScreen[3][0]; pp.y = p.x * localToScreen[0][1] + p.y * localToScreen[1][1] + p.z * localToScreen[2][1] + localToScreen[3][1]; pp.z = .... pp.w = .... maintenant tu passes du repère homogène au repère 'écran', c'est ici que la projection se fait : float inv = 1 / pp.w; pp.x *= inv; pp.y *= inv; pp.z *= inv; pp.x et pp.y sont maintenant les coordonnées de tes points projetés, il ne reste plus qu'à les scaler à la taille de ton viewport. soit width et height la taille de ton viewport : float sx = pp.x * width + width*0.5f; float sy = pp.y * height + height*0.5f; voilà. tu peux maintenant comparer sx et sy avec les coordonnées que t'envoie un WM_MOUSEMOVE par ex. * j'ai peut-être oublié un *0.5f dans la dernière étape, tu verras bien de toute façon quel ordre de grandeur tu obtiens. * y'a peut-être des fonctions dans d3dx qui feront la multiplication pour toi. |
| bjone | bin soit, tu prends effectivement tes coordonnées souris, et tu testes ces coordonnes avec les facettes/vertex transformés.
sinon tu généres un vecteur et tu testes ce vecteur avec les facettes/vertex non transformés. (tu replaces le vecteur dans le repère de l'objet). |
| MrX | Vala , je voudrais faire un prog en 3D (D3DFVF_XYZ) et pouvoir pecho mais vertices avec la souris . Donc me faut calculer les coordonées de mes vertices une fois transformer . J'ai essayé avec les matrices , mais apparament elle ne me donne les vrai coordonées à l'écran (x = 20 , y = 10 pour un point au milieu de l'ecran , c'est un peu hard pour du 1024*768 , je preférerai du x=500 , y=300) . En plus y a la valeur z qui n'existe pas sur un écran . Donc est ce que z est une fontion de x et y . comment on fait . help please . Je suis en VB et DX8 , mais ca ne change quand à la logique du truc |




