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

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

Δημοσ.

Καλησπέρα,

 

έχω φτιάξει μια εφαρμογή που προβάλει τρισδιάστατα δεδομένα. Τώρα θέλω να προσθέσω κάποια λειτουργικότητα για επεξεργασία. Θα επιτρέπεται στον χρήστη να επιλέξει μια επιφάνεια (π.χ. ένα τρίγωνο) και να το μετακινήσει.

 

Για το λόγο αυτό θέλω να παρουσιάζω 3 άξονες, οι οποίοι θα έχουν πάντα το ίδιο μέγεθος, άσχετα αν ο χρήστης πλησιάζει ή απομακρύνεται με την κάμερα. Ουσιαστικά δηλαδή δεν θα έχουν σταθερό μέγεθος αλλά μεταβαλλόμενο.

Χρησιμοποιώ DirectX 9.0. Έχει κανείς καμιά ιδέα για το πως είναι καλύτερο να το κάνω αυτό;

post-178673-0-90554400-1328282651_thumb.png

Δημοσ.

Φτιαξε τη καμερα με δυο view matrices με το εναν να μην εχει scale και το αλλο κανονικο ετσι ωστε οι αξονες να εχουν ξεχωριστο WVP χωρις scale

Δημοσ.

Δεν έχει scale η κάμερα μου. Είναι perspective και άρα αναγκαστικά μόλις πλησιάζεις/απομακρύνεσαι τα σχήματα αλλάζουν μέγεθος.

Ούτως η άλλως πάντως και σε ortho κάμερα, δεν μπορώ να καταλάβω πως θα δούλευε αυτό που λες.

 

Ο κώδικας που κάνει το render είναι ας πούμε κάπως έτσι :

 

>
           m_device.SetTransform((TransformState)D3DTS_PROJECTION, ref ActiveCamera.ProjectionMatrix);
           m_device.SetTransform((TransformState)D3DTS_WORLD, ref ActiveCamera.WorldMatrix);
           m_device.SetTransform((TransformState)D3DTS_VIEW, ref ActiveCamera.ViewMatrix);

           //render every shape in every layer
           foreach (Layer l in Layers)
           {
               if (l.Visible)
                   l.Render(this);
           }

 

Που θα έμπαινε ο νέος view matrix? (Sorry αλλά είμαι και μια βδομάδα με πυρετό και δεν λειτουργώ και πολύ ... )

 

Μάλλον θα πρέπει να πολλαπλασιάζω τα αντικείμενα που δεν θέλω να μετασχηματιστούν, με το αντίστροφο του WPV πριν τα στείλω για render?

Δημοσ.

Επειδη η αξονες μενουν παντα στο 0,0,0 πρεπει να εχουν διαφορετικο view (camera matrix) στο οποιο θα εφαρμοζεις μονο pitch roll yaw. (και φυσικα θα εχεις pres camera, η ortho δεν ειναι για αυτη τη δουλεια)

 

Ποια ειναι η ιδεα. Εχεις εναν κοσμο με μια καμερα, και θελεις σε αυτο το κοσμο να υπαρχει ενα αντικειμενο που να ειναι ανεξαρτητο απο το κοσμο ( zoom (aka scale)) αρα θελεις διαφορετικο view matrix( το matrix που παραγει η καμερα) αυτο το διαφορετικο matrix θελει μονο pitch roll yaw (δλδ να στριφογυριζει).

Απο .νετ δεν εχω ιδα πως παει το d3d, βρες ενα τροπο να παρεις το pitch roll yaw matrix ΜΟΝΟ, υστερα φτιαξε δυο WVP. Ενα κανονικο στο οποιο θα "παιρνανε" ολα τα αντικειμενα και το αλλο με δικο σου V (view) που θα παιρναει μονο το αντικειμενο "αξονες"

 

πχ εχω ενα προject που εχει καμια δεκαρια αντικειμενα (vertices) που αποτελουν το ανθρωποειδες και ενα αντικειμενο "τετραγωνοειδες" που δεν εχει view (αρα μενει στατικο)

 

http://youtu.be/4RR7fOZaPG8

 

 

ΥΓ: Θα σου εγραφα το δευτερο view αλλα το project ειναι πολυ gtp, το εχω για να δοκιμαζω διαφορες μετατροπες

Δημοσ.

Δεν έχει scale η κάμερα μου. Είναι perspective και άρα αναγκαστικά μόλις πλησιάζεις/απομακρύνεσαι τα σχήματα αλλάζουν μέγεθος.

Ούτως η άλλως πάντως και σε ortho κάμερα, δεν μπορώ να καταλάβω πως θα δούλευε αυτό που λες.

 

Ο κώδικας που κάνει το render είναι ας πούμε κάπως έτσι :

 

>
           m_device.SetTransform((TransformState)D3DTS_PROJECTION, ref ActiveCamera.ProjectionMatrix);
           m_device.SetTransform((TransformState)D3DTS_WORLD, ref ActiveCamera.WorldMatrix);
           m_device.SetTransform((TransformState)D3DTS_VIEW, ref ActiveCamera.ViewMatrix);

           //render every shape in every layer
           foreach (Layer l in Layers)
           {
               if (l.Visible)
                   l.Render(this);
           }

 

Που θα έμπαινε ο νέος view matrix? (Sorry αλλά είμαι και μια βδομάδα με πυρετό και δεν λειτουργώ και πολύ ... )

 

Μάλλον θα πρέπει να πολλαπλασιάζω τα αντικείμενα που δεν θέλω να μετασχηματιστούν, με το αντίστροφο του WPV πριν τα στείλω για render?

Τωρα ειδα το εδιτ σου grin.png

 

Ας τα παρουμε απο την αρχη. Το WVP ειναι ενα matrix το οποιο ισοδυναμει με world* trasnformation * view * projection (ο πολλαπλασιασμος γινετε με αυτη την σειρα) το εχουμε για να μην εχουμε 5 matrices μπορεις να τα βαλεις ξεχωριστα και να κανεις τον πολλαλασιασμο μεσα στο shader.

 

Νομιζω οτι εχεις κολλησει στο device.settransform. Αυτο ειναι IA (input assebler stage, αν και δεν ειμαι σιγουρος οτι κατατασσεται σε αυτο το stage) δηλαδη το αλλαζεις πριν καλεσεις καποιον shader. Το καλσεμα των shader (λογικα το Layer ειναι καποια συμμαζεμενη κλαση που εχει vertices buffers, ματιριαλς, shaders) γινεται στο layer.render.

 

Αρα για να βαλεις διαφορετικο view σε καποιο αντικειμενο (layer?) απλα πριν καλεσεις το AneksartitoLayer.Render βαλε device.settransform(aneksartitoView)

Δημοσ.

Μάλλον θα πρέπει να κάνω reset το προηγούμενο view transform και μετά να θέσω ένα άλλο. Διαφορετικά θα πολλαπλασιαστούν μεταξύ τους.

 

Δεν νομίζω ότι διατύπωσα σωστά στο ερώτημα ... ή δεν έγινε απόλυτα κατανοητό.

Δεν θέλω να βάλω κάποια σταθερά αντικείμενα στο 0,0,0 ... αυτό είναι εύκολο. Θέλω να έχω αντικείμενα οπουδήποτε στον κόσμο, το μέγεθος των οποίων να μοιάζει σταθερό μετά την τελική προβολή τους στην οθόνη.

Για παράδειγμα, να μπορώ να εμφανίζω τετράγωνα (σφαίρες, κυλίνδρους κλπ) που να πιάνουν π.χ. 20 x 20 pixel, ανεξαρτήτως θέσης της κάμερας.

Νομίζω ότι αυτό τελικά μπορεί να γίνει μόνο κάνοντας scale τα αντικείμενα αυτά κατά κάποιο τρόπο με το scale της κάμερας, αν αυτό μπορεί να προκύψει από ένα perspective projection.

Δημοσ.

Πρωτον δεν θελει reset (αλλιως θα ειχες πολλλλλαααα προβληματα, φαντασου projection1 * projection2 * projectionN)

 

Το scale ειναι αυτο

fdf0a1a858dab4105bfd8952db64e98b.png

 

Παρε το view απο την καμερα και βαλε 1 στα m11,m22,m33,m44 και μετα κουμπωσε το στη device. viola δεν εχεις scale happy.gif

Δημοσ.

Αυτό που παρουσιάζεις είναι ένας scale matrix. Η πληροφορία αυτή δεν υπάρχει αυτούσια στον WVP ή έστω στον view matrix.

Δημοσ.

Αυτό που παρουσιάζεις είναι ένας scale matrix. Η πληροφορία αυτή δεν υπάρχει αυτούσια στον WVP ή έστω στον view matrix.

 

Βασικα ειπα μαλακια happy.gif (δεν υπαρχει "scale" matrix υπαρχει το homogenous matrix που εχει translate και scale και τα παραγωγα τους) η καμερα δεν κανει scale, αλλα μονο transplate/rotate.

 

Τωρα που το σκεφτομαι (και πιστευω οτι δεν θα ειναι αλλη μια αποτυχια)

 

εστω οτι εχεις το verticesAxies "αξονες" και ξερεις οτι για το σωστο μεγεθος θελεις πχ mScale (δηλαδη το verticesAxies * ( mWorld * mScale * mProjection ) = verticesAxiesOutput {αυτο που θελεις να δεις στη οθονη})

τοτε για να εχεις verticesAxies * ( mWorld * mScale * mView * mProjection ) = verticesAxisOutput πρεπει να βαλεις αλλο ενα scale (mScale1)

 

verticesAxies * ( mWorld * mScale * mScale1 * mView * mProjection ) = verticesAxisOutput

οπου mScale1: maxVectorX / maxVectorX1

 

maxVectorX = max(verticesAxies.x)

maxVectorX1 = maxVectrorX * (mWolrd * mScale * mView * mProjection)

 

ΥΓ: Βαζω max γιατι αν ο vector.x ειναι μηδεν τοτε δεν μπορεις να βρεις την διαφορα

ΥΓ1: Τωρα που το βλεπω ειναι λιγο μπερδεμα, με αλλα λογια αυτο που θελω να πω ειναι να εχεις ενα σημειο/vector/vertex (maxVectorX) αναφοραρα για το μεγεθος του σχηματος, επιτα να το πολλαπλασιασεις με το WVP ετσι ωστε να δεις πως θα μετασχηματιστει με το τρεχον wvp. Να παρεις το μετασχηματισμενο και να το διαιρεσεις με το αυτο που ηθελες ωστε να βγαλεις το scale fa.

 

cool.png

Δημοσ.

Αυτό που ζητάς, το είχα αντιμετώπίσει κι εγώ κάποτε στο opengl.

Επειδή είχα βαρεθεί το ψάξιμο, το έκανα με scale όπως είπες.

 

Οι άξονες μεγενθύνονταν αυτόματα με κάποιον παράγοντα που εξαρτώταν από την απόσταση.

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

Δεν ήταν ακριβώς αυτό που ήθελα αλλά για την εφαρμογή

που έφτιαχνα ήταν μια χαρά και δεν ασχολήθηκα περισσότερο.

 

-

Δημοσ.

Μάλλον κάτι τέτοιο θα κάνω. Είναι ένα θέμα γενικώς τα scale invariant σχήματα.

Σε ortho κάμερα πάντως είναι εύκολο να υπολογίσεις το scale.

Δημοσ.

Aν πάντως προσθέσεις και χειροκίνητη μεγέθυνση των αξόνων (έστω και για δικό σου debugging)

έχε κατά νου ότι πρέπει να θέσεις διαφορετικές βαθμίδες ανάλογα με την απόσταση.

 

Εγώ είχα τρεις.

Για μεγάλες αποστάσεις (π.χ. 10 ως 100), κάθε βήμα μεγέθυνσης ήταν της τάξης του (ας πούμε) 10.

Για μέσες (π.χ. 1 εως 10), βήματα του 1.

Για μικρές (π.χ. 0.1 εως 1), βήματα του .1 ("μικρομετρική ρύθμιση").

 

Κάπως έτσι.

Αλλιώς το σχήμα θα μεγαλώνει τελείως δυσανάλογα σε σχέση με το αναμενόμενο ή/και δεν θα

μπορείς να του δώσεις γρήγορα το επιθυμητό μέγεθος.

Για το πώς θα το μεγαλώνεις αυτόματα, θέλει πολλές δοκιμές μέχρι να βρεις έναν ανεκτό τρόπο -

και πάλι δεν είναι σίγουρο το καλό αποτέλεσμα...

 

-

Δημοσ.

Δεν είναι γραμμική η σχέση της απόστασης της κάμερας με ένα αντικείμενο και της διαφαινόμενης κλίμακας (του αντικειμένου); Δεν θα μπορούσα να το πετύχω με ένα σταθερό συντελεστή;

 

Π.χ.

 

scale = 0.12345 * distance(camera, object)

 

Ίσως θα μπορούσα να βρω αυτό τον συντελεστή σε διάφορες αποστάσεις (δειγματοληψία) και μετά να προσεγγίσω την σχέση με interpolation, π.χ. με κάποιο spline;

Δημοσ.

Δεν είναι γραμμική η σχέση της απόστασης της κάμερας με ένα αντικείμενο και της διαφαινόμενης κλίμακας (του αντικειμένου); Δεν θα μπορούσα να το πετύχω με ένα σταθερό συντελεστή;

 

Π.χ.

 

scale = 0.12345 * distance(camera, object)

 

Ίσως θα μπορούσα να βρω αυτό τον συντελεστή σε διάφορες αποστάσεις (δειγματοληψία) και μετά να προσεγγίσω την σχέση με interpolation, π.χ. με κάποιο spline;

 

Πραγματι μεσου αποστασης θα βγαλεις το scale ...

 

κρατα καπου το eye το πρωτο, με αυτο που θα εχει το αποτελεσμα που επιθυμεις

και μετα βγαλε το scale

 

scale = sqrt( dot(currenttEye - mesh * transformationMatrix) ) / sqrt(dot(firstEye - mesh * transformationMatrix))

 

 

ΥΓΑυτη τη φορα το δοκιμασα happy.gif

 

ΥΓ2 Επισεις να το ζωγραφισεις τελευταιο με απενεργοποιημενο το depth test για να ειναι ορατο σε περιπτοση που βρησκεται μεσα σε καποιο αντικειμενο

Δημοσ.

φ=εστιακή απόσταση φακού

π=απόσταση αντικειμένου από φακό

π'=απόσταση που σχηματίζεται το είδωλο, από φακό

 

σχέση μεταξύ τους: 1/φ = 1/π + 1/π'

η σχέση ειδώλου/αντικείμενο = π'/π

(αφού το φ,π, και μέγεθος αντικειμένου, είναι γνωστά, υπολογίζεται το π' και άρα αυτό που ζητάς)

 

δες κι αυτό το πχ [PDF] ΒΑΣΙΚΕΣ ΑΡΧΕΣ ΤΗΣ ΟΠΤΙΚΗΣ

 

http://www.google.com/search?client=ubuntu&channel=fs&q=%CF%83%CF%87%CE%AD%CF%83%CE%B7+%CE%B5%CF%83%CF%84%CE%B9%CE%B1%CE%BA%CE%AE%CF%82+%CE%B1%CF%80%CF%8C%CF%83%CF%84%CE%B1%CF%83%CE%B7%CF%82%2C+%CE%B1%CE%BD%CF%84%CE%B9%CE%BA%CE%B5%CE%B9%CE%BC%CE%AD%CE%BD%CE%BF%CF%85+%CE%BA%CE%B1%CE%B9+%CE%B5%CE%B9%CE%B4%CF%8E%CE%BB%CE%BF%CF%85&ie=utf-8&oe=utf-8

 

.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...