Προς το περιεχόμενο

πολλαπλασιασμος vector με matrix πως;


παπι

Προτεινόμενες αναρτήσεις

Δημοσ.

Πως στο καλο πολλαπλασιαζουμε 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 οταν σε θελω happy.gif

Δημοσ.
Δημοσ.

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

Δημοσ.

Αυτο εκανα στην αρχη (απο 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

 

σε αυτο shock.png

 

http://dl.dropbox.co...44/rotprob3.jpg

http://dl.dropbox.co...44/rotprob4.jpg

 

(δεν τα βαζω σε img tag γιατι ειναι fhd)

 

Τωρα που το βλεπω.... μου φαινεται οτι του εκανα scal confused.png οτι να'ναι

 

εδιτ τωρα ειδα το εδιτ σου, αυτο εκανα στη δευτερη προσπαθεια, κατσε να το ξανακανω μπας και μου εφυγε τπτ

 

εδιτ Οκ το κανει το rotate αλλα κατι δε παει καλα...

http://dl.dropbox.com/u/31291344/rotprob5.jpg

Δημοσ.

Στείλε μου αν θες το mail σου να σου στείλω μερικές σελίδες μπορεί να σου φανούν χρήσιμες.

Έχουν πολλή λεπτομέρεια και αν επιχειρήσω να τις αντιγράψω εδώ θα κάνω λάθος.

 

-

Δημοσ.

Γιατι οταν ψαχνεις κατι για ωρες αυτο ειναι (ενα μικροσκοπικο λαθακι) μπροστα στα ματια σου;

>	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;
};

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...