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

Γραφικά - Μετατροπή 3d (x, y, z) σημείου σε 2d (x', y') σε ορθογραφική προβολή

Ερώτηση

Καλησπέρα,

 

θέλω να υλοποιήσω ένα απλό 2d παιχνίδι, στο οποίο όμως θα χρησιμοποιώ 3d λογική μια και πιστεύω θα με βοηθήσει περισσότερο στο να έχω περισσότερη ακρίβεια σε θέματα collision detection - response. Ωστόσο, δε θέλω να έχω προοπτική στα γραφικά. Ενδεικτικά παραδείγματα για το στυλ και την οπτική που θέλω να έχει το παιχνίδι είναι τα παλιά Ikari Warriors, Sensible Soccer και Cannon Fodder. Υποθέτω ότι πρόκειται για ορθογραφική προβολή. Διορθώστε με αν κάνω λάθος.

 

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

 

- Ποια είναι η διαδικασία βήμα προς βήμα που πρέπει να ακολουθήσει κανείς για να μετατρέψει μία 3d συντεταγμένη (x, y, z) σε 2d (x', y')?

- Πρέπει να χρησιμοποιηθούν απαραίτητα matrices ή υπάρχουν εξισώσεις που συνδέουν τις συντεταγμένες μεταξύ τους?

- Πρέπει αρχικά να γίνει κάποια αρχικοποίηση? Π.χ. να οριστεί θέση και κατεύθυνση κάμερας ή / και κάτι άλλο? Αν ναι, στην περίπτωση τη δική μου, η κάμερα θα έχει σταθερό σημείο και γωνία.

 

Υ.Γ. Αν είναι απαραίτητη ως πληροφορία, η υλοποίηση γίνεται σε actionscript 3.0, οπότε δε γίνεται χρήση κάποιας βιβλιοθήκης τύπου OpenGL.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

10 απαντήσεις σε αυτή την ερώτηση

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

  • 0

Καλησπέρα,

 

θέλω να υλοποιήσω ένα απλό 2d παιχνίδι, στο οποίο όμως θα χρησιμοποιώ 3d λογική μια και πιστεύω θα με βοηθήσει περισσότερο στο να έχω περισσότερη ακρίβεια σε θέματα collision detection - response. Ωστόσο, δε θέλω να έχω προοπτική στα γραφικά. Ενδεικτικά παραδείγματα για το στυλ και την οπτική που θέλω να έχει το παιχνίδι είναι τα παλιά Ikari Warriors, Sensible Soccer και Cannon Fodder.

Στα 2D παιχνίδια τύπου Ikari Warriors, Cannon Fodder το colission detection βασίζεται σε overlapping rectangle-regions και για περισσότερη ειδίκευση όταν καταγραφεί collision στα rectangle regions πάμε σε pixel perfect collision detection. Τουλάχιστον αυτός ήταν ο τυπικός τρόπος στα old school παιχνίδια.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

ΚΑΛΗΣΠΕΡΑ!ΓΙΑ ΤΟ ΘΕΜΑ ΣΟΥ ΔΕ ΜΠΟΡΩ ΝΑ ΒΟΗΘΗΣΩ,ΑΝ ΚΑΙ ΕΙΜΑΙ ΑΡΧΑΙΟΣ GAMER...(SPECTRUM 48K COMMODORE 64 AMIGA 500 K.,L.P.),ΘΑ ΣΟΥ ΠΩ ΕΝΑ ΜΕΓΑΛΟ ΜΠΡΑΒΟ ΓΙΑ ΤΟ NICKNAME ΣΟΥ!!ΕΙΜΑΙ ΠΙΣΤΟΣ ΟΠΑΔΟΣ ΤΗΣ ΜΠΑΝΤΑΣ ΑΠΟ ΤΟ 1988!17 ΜΑΙΟΥ ΕΧΩ ΚΛΕΙΣΕΙ ΓΙΑ ΒΙΕΝΝΗ ΚΑΙ 29 ΙΟΥΝΙΟΥ ΓΙΑ ΜΙΛΑΝΟ!!ΣΤΟ ΟΑΚΑ ΦΥΣΙΚΑ ΗΜΟΥΝ ΣΤΟ COSMOTE CIRCLE!!ΝΑ ΕΙΣΑΙ ΚΑΛΑ ΚΑΙ ΚΑΛΗ ΤΥΧΗ ΣΤΟ PROJECT ΣΟΥ!!!

  • Like 2

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Στα 2D παιχνίδια τύπου Ikari Warrios, Cannon Fodder το colission detection βασίζεται σε overlapping rectangle-regions και για περισσότερη ειδίκευση όταν καταγραφεί collision στα rectangle regions πάμε σε pixel perfect collision detection. Τουλάχιστον αυτός ήταν ο τυπικός τρόπος στα old school παιχνίδια.

 

Πρόκειται για τα λεγόμενα grid-based systems στα οποία ανάλογα με τα αντικείμενα που βρίσκονται σε κάποιο tile (ή rectangle ανάλογα όπως έγραψες), εφαρμόζεις collision detection μόνο σε αυτά ώστε να έχεις λιγότερους υπολογισμούς και να μην επιβαρύνεται η cpu?

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Δες εδω

http://www.insomnia.gr/topic/477835-share-3d-console/

 

Βεβαια δεν εχω ortho αλλα perspective

Η διαδικασια ειναι

α) Transformations (η λογικη του παιχνιδιου δεν εχει να κανει με το x,y,z => x,y)

β) camera transformation 

γ) cliping

δ) projecting

ε) viewport transformation

 

Η μετατροπη γινεται στο γ,δ που πανε μαζι

projection.jpg

Λοιπον το cliping ειναι ο χωρος τον οποιον θες να προβαλεις, οπως βλεπεις στην εικονα ειναι ολο αυτο το κυβοειδες. Σε perspective ειναι κυβοειδες σε ortho ειναι κυβος (εννοω οτι οι γωνεις ειναι ορθες, ενω στο αλλο δεν ειναι).

 

Η προβλολη "γινεται" στο near clipping panel (projection)

 

Το camera transformation "σπρωχνει" τα διανυσματα ωστε να μπουν στο clipping panel ετσι οπως τα θελουμε.

 

Εως εδω εχεις μετατρεψει τα x,y,z σε x,y. Τωρα εχεις x,y και z για z index, εδω πρεπει να τα μετατρεψεις σε screen coords δηλαδη απο -1,0 1,-1 σε 0,0 height,width.

 

Τελος πριν μετατρεψεις τα vertices σε image πρεπει να κανεις z index test (δηλαδη στην εικονα θα εμφανιζεται το pixel με το μικροτερο z )

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Πρόκειται για τα λεγόμενα grid-based systems στα οποία ανάλογα με τα αντικείμενα που βρίσκονται σε κάποιο tile (ή rectangle ανάλογα όπως έγραψες), εφαρμόζεις collision detection μόνο σε αυτά ώστε να έχεις λιγότερους υπολογισμούς και να μην επιβαρύνεται η cpu?

Περίπου.. μπορεί να εφαρμοσθεί γενικά σε 2D παιχνίδια, η τεχνική είναι να ελέγχεις το rectangle κάθε sprite για σύγκρουση και αν θες να έχεις μεγαλύτερη ευελιξία μπορείς ύστερα να κάνεις έλεγχο σε επίπεδο pixel για το αν το σημείο που έγινε το overlap περιείχε πληροφορίες του sprite ή ήταν transparent οπότε αυξάνεις θεαματικά την ακρίβεια του ελέγχου σύγκρουσης κρατώντας και τους κύκλους της CPU χαμηλά (το pixel-perfect κοστίζει).

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Πολύ ενδιαφέρον, Directx. Κατά την άποψή σου, μήπως δεν είναι απαραίτητο το mapping που ζητάω σε ορθογραφική προβολή στην περίπτωσή μου? Σκεφτόμουν να το εφαρμόσω, επειδή θέλω να δώσω ύψος σε αντικείμενα (όπως π.χ. στο cannon fodder που πετάς χειροβομβίδες στον αέρα) αλλά ήθελα να έχω στο background και τη 3d λογική. Για παράδειγμα, αν πετάς στον αέρα ένα αντικείμενο σε σχήμα σφαίρας και πέφτει πάνω σε ένα αντικείμενο, π.χ. κύβο... τότε οι εξισώσεις τομής σφαίρας και κύβου ίσως θα με βόλευαν για περισσότερη ακρίβεια. Και απλά με το mapping θα εμφάνιζα τα αντικείμενα εκεί που πρέπει στη 2d ορθογραφική προβολή.

 
παπι, ευχαριστώ για τις οδηγίες. Είναι μία κατεύθυνση βασισμένη σε βήματα, οπότε μπορώ να συνεχίσω πιο συγκεκριμένα τις αναζητήσεις μου. Άλλωστε με ενδιαφέρει γενικότερα το θέμα και στην περίπτωση του perspective projection.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Πολύ ενδιαφέρον, Directx. Κατά την άποψή σου, μήπως δεν είναι απαραίτητο το mapping που ζητάω σε ορθογραφική προβολή στην περίπτωσή μου? Σκεφτόμουν να το εφαρμόσω, επειδή θέλω να δώσω ύψος σε αντικείμενα (όπως π.χ. στο cannon fodder που πετάς χειροβομβίδες στον αέρα) αλλά ήθελα να έχω στο background και τη 3d λογική. Για παράδειγμα, αν πετάς στον αέρα ένα αντικείμενο σε σχήμα σφαίρας και πέφτει πάνω σε ένα αντικείμενο, π.χ. κύβο... τότε οι εξισώσεις τομής σφαίρας και κύβου ίσως θα με βόλευαν για περισσότερη ακρίβεια. Και απλά με το mapping θα εμφάνιζα τα αντικείμενα εκεί που πρέπει στη 2d ορθογραφική προβολή.

Εκείνα τα χρόνια τέτοια προβλήματα λυνόντουσαν πιο απλά, τα CPU εκείνης της εποχής δεν βοηθούσαν και πολύ σε τέτοια θέματα, συνεπώς εφάρμοζαν απλές λύσεις που δούλευαν όμορφα και στο μάτι και στην ταχύτητα, πχ. με μια CPU στα 4.5Mhz (8bit) που αναλάμβανε να σχεδιάσει ολόκληρη την οθόνη κλπ. δεν υπήρχε χώρος για τέτοιες πολυτέλειες..

 

Από εκεί και πέρα, όπως σου είπα το mainstream εκείνων των χρόνων ήταν rectangle και pixel-perfect collision (μάλιστα λόγο ότι διάβαζαν απευθείας από την video RAM ήταν και αρκετά εύκολο το τελευταίο :-D) φυσικά εσύ δεν δεσμεύεσαι από αυτό, μπορείς να το δοκιμάσεις με όποιον τρόπο πιστεύεις ότι θα τα καταφέρεις καλύτερα..

 

Υ.Γ.

Για το πέταγμα της χειροβομβίδας εγώ θα το έκανα ως εξής, από το σημείο που την πετάς θα πήγαινε άμεσα σε συγκεκριμένο νέο σημείο (fix υπολογισμός) αλλά με την μεσολάβηση ενός animation που θα αύξανε το μέγεθος της καθώς αυξάνει ύψος και την μετακινεί στην νέα θέση ενώ επανέρχεται στις ανάλογες διαστάσεις (αυτά πολύ γενικά πάντα)..

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Εχε το νου σου πως με orthogonal projection δεν μπορεις να δωσεις την αισθηση του βαθους.

πχ

post-216584-0-80340000-1362584473_thumb.jpg

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Αυτό που πρότεινε ο directx είναι το καλύτερο νομίζω.Αν βάλεις 3Δ λογική θα κάνεις τη ζωη σου πιο δυσκολη.

 

Κάνε BB collision detection και αν θες μεγαλύτερη ακρίβεια κάνεις και pixel perfect collision detection ( εφόσον πιο πριν έχεις κάνει bounding box collision detection).

 

pixel perfect collision detection μπορεις να κάνεις πολύ εύκολα με masking.Βάζεις στο transparent κομμάτι μια τιμή ή ένα χρώμα( έστω μαύρο ) και σε όλο το υπόλοιπο ένα άλλο ( έστω άσπρο) και βλέπεις αν το άσπρο της μιας ειναι μεσα στο άσπρο της άλλης.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

παπί, το γνωρίζω και για αυτό το λόγο θέλω orthogonal projection. Δε θέλω να κάνω scale τα αντικείμενα και να δώσω την αίσθηση του βάθους. Ακόμα και το ρίξιμο ενός αντικειμένου στον αέρα, το έχω συνδυάσει με μία σκιά από κάτω για να υπάρχει η ψευδαίσθηση ότι το αντικείμενο είναι πράγματι στον αέρα. Ένα πειραματάκι που έκανα, φαίνεται στο link εδώ. Εκεί κάνεις κλικ οπουδήποτε στη σκηνή και το αντικείμενο κινείται στον αέρα με γωνία ίση με εκείνη της κόκκινης γραμμής. Απλά σκεφτόμουν το μοντέλο του παιχνιδιού να είναι σε 3d λογική για το θέμα των collisions που είπαμε πριν.

 

Ωστόσο, θα κοιτάξω και την τεχνική που είπε ο directx με τη χρήση bb collision detection. ChRis6, πολύ καλό ακούγεται αυτό με το masking.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

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

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

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.