kagelos Δημοσ. 3 Φεβρουαρίου 2012 Δημοσ. 3 Φεβρουαρίου 2012 Καλησπέρα, έχω φτιάξει μια εφαρμογή που προβάλει τρισδιάστατα δεδομένα. Τώρα θέλω να προσθέσω κάποια λειτουργικότητα για επεξεργασία. Θα επιτρέπεται στον χρήστη να επιλέξει μια επιφάνεια (π.χ. ένα τρίγωνο) και να το μετακινήσει. Για το λόγο αυτό θέλω να παρουσιάζω 3 άξονες, οι οποίοι θα έχουν πάντα το ίδιο μέγεθος, άσχετα αν ο χρήστης πλησιάζει ή απομακρύνεται με την κάμερα. Ουσιαστικά δηλαδή δεν θα έχουν σταθερό μέγεθος αλλά μεταβαλλόμενο. Χρησιμοποιώ DirectX 9.0. Έχει κανείς καμιά ιδέα για το πως είναι καλύτερο να το κάνω αυτό;
παπι Δημοσ. 3 Φεβρουαρίου 2012 Δημοσ. 3 Φεβρουαρίου 2012 Φτιαξε τη καμερα με δυο view matrices με το εναν να μην εχει scale και το αλλο κανονικο ετσι ωστε οι αξονες να εχουν ξεχωριστο WVP χωρις scale
kagelos Δημοσ. 3 Φεβρουαρίου 2012 Μέλος Δημοσ. 3 Φεβρουαρίου 2012 Δεν έχει 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?
παπι Δημοσ. 3 Φεβρουαρίου 2012 Δημοσ. 3 Φεβρουαρίου 2012 Επειδη η αξονες μενουν παντα στο 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, το εχω για να δοκιμαζω διαφορες μετατροπες
παπι Δημοσ. 4 Φεβρουαρίου 2012 Δημοσ. 4 Φεβρουαρίου 2012 Δεν έχει 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? Τωρα ειδα το εδιτ σου Ας τα παρουμε απο την αρχη. Το 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)
kagelos Δημοσ. 4 Φεβρουαρίου 2012 Μέλος Δημοσ. 4 Φεβρουαρίου 2012 Μάλλον θα πρέπει να κάνω reset το προηγούμενο view transform και μετά να θέσω ένα άλλο. Διαφορετικά θα πολλαπλασιαστούν μεταξύ τους. Δεν νομίζω ότι διατύπωσα σωστά στο ερώτημα ... ή δεν έγινε απόλυτα κατανοητό. Δεν θέλω να βάλω κάποια σταθερά αντικείμενα στο 0,0,0 ... αυτό είναι εύκολο. Θέλω να έχω αντικείμενα οπουδήποτε στον κόσμο, το μέγεθος των οποίων να μοιάζει σταθερό μετά την τελική προβολή τους στην οθόνη. Για παράδειγμα, να μπορώ να εμφανίζω τετράγωνα (σφαίρες, κυλίνδρους κλπ) που να πιάνουν π.χ. 20 x 20 pixel, ανεξαρτήτως θέσης της κάμερας. Νομίζω ότι αυτό τελικά μπορεί να γίνει μόνο κάνοντας scale τα αντικείμενα αυτά κατά κάποιο τρόπο με το scale της κάμερας, αν αυτό μπορεί να προκύψει από ένα perspective projection.
παπι Δημοσ. 5 Φεβρουαρίου 2012 Δημοσ. 5 Φεβρουαρίου 2012 Πρωτον δεν θελει reset (αλλιως θα ειχες πολλλλλαααα προβληματα, φαντασου projection1 * projection2 * projectionN) Το scale ειναι αυτο Παρε το view απο την καμερα και βαλε 1 στα m11,m22,m33,m44 και μετα κουμπωσε το στη device. viola δεν εχεις scale
kagelos Δημοσ. 5 Φεβρουαρίου 2012 Μέλος Δημοσ. 5 Φεβρουαρίου 2012 Αυτό που παρουσιάζεις είναι ένας scale matrix. Η πληροφορία αυτή δεν υπάρχει αυτούσια στον WVP ή έστω στον view matrix.
παπι Δημοσ. 5 Φεβρουαρίου 2012 Δημοσ. 5 Φεβρουαρίου 2012 Αυτό που παρουσιάζεις είναι ένας scale matrix. Η πληροφορία αυτή δεν υπάρχει αυτούσια στον WVP ή έστω στον view matrix. Βασικα ειπα μαλακια (δεν υπαρχει "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.
V.I.Smirnov Δημοσ. 5 Φεβρουαρίου 2012 Δημοσ. 5 Φεβρουαρίου 2012 Αυτό που ζητάς, το είχα αντιμετώπίσει κι εγώ κάποτε στο opengl. Επειδή είχα βαρεθεί το ψάξιμο, το έκανα με scale όπως είπες. Οι άξονες μεγενθύνονταν αυτόματα με κάποιον παράγοντα που εξαρτώταν από την απόσταση. Είχα βάλει επίσης και μεγέθυνση των αξόνων χειροκίνητα από τον χρήστη. Δεν ήταν ακριβώς αυτό που ήθελα αλλά για την εφαρμογή που έφτιαχνα ήταν μια χαρά και δεν ασχολήθηκα περισσότερο. -
kagelos Δημοσ. 5 Φεβρουαρίου 2012 Μέλος Δημοσ. 5 Φεβρουαρίου 2012 Μάλλον κάτι τέτοιο θα κάνω. Είναι ένα θέμα γενικώς τα scale invariant σχήματα. Σε ortho κάμερα πάντως είναι εύκολο να υπολογίσεις το scale.
V.I.Smirnov Δημοσ. 5 Φεβρουαρίου 2012 Δημοσ. 5 Φεβρουαρίου 2012 Aν πάντως προσθέσεις και χειροκίνητη μεγέθυνση των αξόνων (έστω και για δικό σου debugging) έχε κατά νου ότι πρέπει να θέσεις διαφορετικές βαθμίδες ανάλογα με την απόσταση. Εγώ είχα τρεις. Για μεγάλες αποστάσεις (π.χ. 10 ως 100), κάθε βήμα μεγέθυνσης ήταν της τάξης του (ας πούμε) 10. Για μέσες (π.χ. 1 εως 10), βήματα του 1. Για μικρές (π.χ. 0.1 εως 1), βήματα του .1 ("μικρομετρική ρύθμιση"). Κάπως έτσι. Αλλιώς το σχήμα θα μεγαλώνει τελείως δυσανάλογα σε σχέση με το αναμενόμενο ή/και δεν θα μπορείς να του δώσεις γρήγορα το επιθυμητό μέγεθος. Για το πώς θα το μεγαλώνεις αυτόματα, θέλει πολλές δοκιμές μέχρι να βρεις έναν ανεκτό τρόπο - και πάλι δεν είναι σίγουρο το καλό αποτέλεσμα... -
kagelos Δημοσ. 5 Φεβρουαρίου 2012 Μέλος Δημοσ. 5 Φεβρουαρίου 2012 Δεν είναι γραμμική η σχέση της απόστασης της κάμερας με ένα αντικείμενο και της διαφαινόμενης κλίμακας (του αντικειμένου); Δεν θα μπορούσα να το πετύχω με ένα σταθερό συντελεστή; Π.χ. scale = 0.12345 * distance(camera, object) Ίσως θα μπορούσα να βρω αυτό τον συντελεστή σε διάφορες αποστάσεις (δειγματοληψία) και μετά να προσεγγίσω την σχέση με interpolation, π.χ. με κάποιο spline;
παπι Δημοσ. 5 Φεβρουαρίου 2012 Δημοσ. 5 Φεβρουαρίου 2012 Δεν είναι γραμμική η σχέση της απόστασης της κάμερας με ένα αντικείμενο και της διαφαινόμενης κλίμακας (του αντικειμένου); Δεν θα μπορούσα να το πετύχω με ένα σταθερό συντελεστή; Π.χ. scale = 0.12345 * distance(camera, object) Ίσως θα μπορούσα να βρω αυτό τον συντελεστή σε διάφορες αποστάσεις (δειγματοληψία) και μετά να προσεγγίσω την σχέση με interpolation, π.χ. με κάποιο spline; Πραγματι μεσου αποστασης θα βγαλεις το scale ... κρατα καπου το eye το πρωτο, με αυτο που θα εχει το αποτελεσμα που επιθυμεις και μετα βγαλε το scale scale = sqrt( dot(currenttEye - mesh * transformationMatrix) ) / sqrt(dot(firstEye - mesh * transformationMatrix)) ΥΓΑυτη τη φορα το δοκιμασα ΥΓ2 Επισεις να το ζωγραφισεις τελευταιο με απενεργοποιημενο το depth test για να ειναι ορατο σε περιπτοση που βρησκεται μεσα σε καποιο αντικειμενο
gtroza Δημοσ. 6 Φεβρουαρίου 2012 Δημοσ. 6 Φεβρουαρίου 2012 φ=εστιακή απόσταση φακού π=απόσταση αντικειμένου από φακό π'=απόσταση που σχηματίζεται το είδωλο, από φακό σχέση μεταξύ τους: 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 .
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα