παπι Δημοσ. 12 Ιουλίου 2011 Δημοσ. 12 Ιουλίου 2011 Πως στο καλο πολλαπλασιαζουμε vector με matrix; εχω κανει το παρακατω αλλα... δεν... >bool __stdcall RotateX_Vertex_clsA(std::vector<VERTEX_CLASS_A>& vecs, float r) { if(vecs.empty()) return false; auto mul =[](D3DXVECTOR3& out,D3DXMATRIX& in) { out.x = out.x * in._11 + out.y * in._12 + out.z * in._13; out.y = out.x * in._21 + out.y * in._22 + out.z * in._23 ; out.z = out.x * in._31 + out.y * in._32 + out.z * in._33 ; }; D3DXMATRIX matRx; D3DXMatrixRotationX(&matRx,r); std::for_each(vecs.begin(),vecs.end(),[&matRx,&mul](VERTEX_CLASS_A& clsa) { mul(clsa.pos,matRx); }); return true; } ΥΓ: Που'σαι ρε smirnov οταν σε θελω
migf1 Δημοσ. 12 Ιουλίου 2011 Δημοσ. 12 Ιουλίου 2011 Δες λίγο μήπως σε βοηθάει κάποιο από αυτά: http://fastcpp.blogspot.com/2011/03/matrix-vector-multiplication-using-sse3.html http://stackoverflow.com/questions/3752638/c-matrix-vector-multiplication http://www.facstaff.bucknell.edu/mastascu/elessonsHTML/Circuit/MatVecMultiply.htm http://www.dreamincode.net/forums/topic/180576-matrix-vector-multiplication/ ΥΓ. Εγώ δυστυχώς έχω πάααρα πολύ καιρό να ασχοληθώ με C++
V.I.Smirnov Δημοσ. 12 Ιουλίου 2011 Δημοσ. 12 Ιουλίου 2011 Tι έγινε, ξεχάσαμε να πολλαπλασιάζουμε πίνακες ; Φαντάζομαι θα το βρήκες μόνος σου διότι είναι απλούστατο. Για το DX η σύμβαση που ακολουθείται στο γινόμενο για τους μετασχηματισμούς είναι vector-on-left, row-major-order Μαθηματικά προκύπτει ένα διάνυσμα με 1 γραμμή και 4 στήλες. Δες το αποτέλεσμα στo συνημμένο. Όμοια είναι και για διανύσματα με τρεις συνιστώσες. Στο opengl ακολουθείται η σύμβαση vector-on-right, column-major-order. Ο πίνακας εδώ είναι ο ανάστροφος του παραπάνω. Μαθηματικά αυτό που προκύπτει είναι ένα διάνυσμα με 4 γραμμές και 1 στήλη. Αλλά τα στοιχεία του είναι τα ίδια με πριν. Πέραν αυτών, το DX απ' όσο θυμάμαι έχει συναρτήσεις που υποστηρίζουν πράξεις με διάνυσμα και πίνακα. Αν θυμάμαι καλά πρέπει να είναι οι D3DXVECTOR4 * D3DXVec4Transform( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, CONST D3DXMATRIX *pM ); και η D3DXVECTOR4 * D3DXVec4TransformArray( D3DXVECTOR4 *pOut, UINT OutStride, CONST D3DXVECTOR4 *pV, UINT VStride, CONST D3DXMATRIX *pM, UINT n ); Οι συναρτήσεις αυτές πολλαπλασιάζουν (με την παραπάνω σύμβαση) ένα διάνυσμα με έναν πίνακα. Δηλ. ο πίνακας μπορεί να αναπαριστά οποιονδήποτε μετασχηματισμό. Σου εύχομαι να μην μετανιώσεις που ασχολείσαι με το DirectX όπως μετάνιωσα εγώ... - VecMatMul.pdf
migf1 Δημοσ. 13 Ιουλίου 2011 Δημοσ. 13 Ιουλίου 2011 Μήπως βοηθάει αυτή εδώ; http://msdn.microsoft.com/en-us/library/ms599350.aspx ΥΓ. Αχώνευτο τελείως το Dx !
παπι Δημοσ. 13 Ιουλίου 2011 Μέλος Δημοσ. 13 Ιουλίου 2011 Αυτο εκανα στην αρχη (απο wiki) το θεμα ειναι οτι εγω για την ακριβια θελω να αλλαξω τον πανω αξονα (απο Z να το κανω Y) δηλαδη με απλα λογια να κανω περιστροφη -90 μοιρες τον αξονα X (το ζ να γινει βαθος και ο ψ υψος) Για να το κανω αυτο στο DX ειναι ευκολο κανεις rotate ενα matrix και το πολλαπλασιαζεις με το w v p το οποιο πολλαπλασιαζεται με ολα τα σημεια μεσα στη gpu με το VS, ετσι λεω εγω οτι θα ειναι ευκολο να το κανω με raw σημεια ελα που δεν.. Φτιαχνω ενα matrix το κανω rotate και το πολλαπλασιαζω με τη (μεθοδο που λες εσυ (και το wiki)) αλλα βγενει οτι ναναι δες απο αυτο http://dl.dropbox.co...44/rotprob1.jpg http://dl.dropbox.co...44/rotprob2.jpg σε αυτο http://dl.dropbox.co...44/rotprob3.jpg http://dl.dropbox.co...44/rotprob4.jpg (δεν τα βαζω σε img tag γιατι ειναι fhd) Τωρα που το βλεπω.... μου φαινεται οτι του εκανα scal οτι να'ναι εδιτ τωρα ειδα το εδιτ σου, αυτο εκανα στη δευτερη προσπαθεια, κατσε να το ξανακανω μπας και μου εφυγε τπτ εδιτ Οκ το κανει το rotate αλλα κατι δε παει καλα... http://dl.dropbox.com/u/31291344/rotprob5.jpg
V.I.Smirnov Δημοσ. 13 Ιουλίου 2011 Δημοσ. 13 Ιουλίου 2011 Στείλε μου αν θες το mail σου να σου στείλω μερικές σελίδες μπορεί να σου φανούν χρήσιμες. Έχουν πολλή λεπτομέρεια και αν επιχειρήσω να τις αντιγράψω εδώ θα κάνω λάθος. -
παπι Δημοσ. 13 Ιουλίου 2011 Μέλος Δημοσ. 13 Ιουλίου 2011 Γιατι οταν ψαχνεις κατι για ωρες αυτο ειναι (ενα μικροσκοπικο λαθακι) μπροστα στα ματια σου; > auto mul =[](D3DXVECTOR3& out,D3DXMATRIX& in) { float w = 1.0f; out.x = out.x * in._11 + out.y * in._12 + out.z * in._13 + w * in._14; out.y = out.x * in._21 + out.y * in._22 + out.z * in._23 + w * in._24; out.z = out.x * in._31 + out.y * in._32 + out.z * in._33 + w * in._34; }; Απιστευτο >auto mul =[](D3DXVECTOR3& out,D3DXMATRIX& in) { float w = 1.0f; D3DXVECTOR3 tmp; tmp.x = out.x * in._11 + out.y * in._12 + out.z * in._13 + w * in._14; tmp.y = out.x * in._21 + out.y * in._22 + out.z * in._23 + w * in._24; tmp.z = out.x * in._31 + out.y * in._32 + out.z * in._33 + w * in._34; out = tmp; };
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.