EDIT NOVEMBER 17TH, 2010: Go to page 6 for the latest version. The stuff below is old and busted.
viewtopic.php?f=5&t=1399&p=22601#p22601
Seems everyone's on a 3D kick these days, so here's a 3D Cube...
But it's not just a cube. It's whatever the heck you want it to be! This, ladies and gentlemen, is how you do 3D with non 3D hardware. (Aside from raytracing of course)
Based on an old idea that's been around since the late 80's and 90's in the days of QBASIC.
Don't expect to use this for any real 3D worlds or anything. This is just for 3D models. Things go wonky if you try to move the lines out of the window. Think of this as good enough for a 3D model of the Death Star or a spinning wire-frame logo or something.
The code, while partially identical in maths to what I had in the 90's, is borrowed from a webpage about Flash and ActionScript of all places. And it worked so well I expanded it. With modifications to how things work of course. I added the ability to sort the points table so distant points are smaller than closer ones, which will actually help it be real 3D.
It's pretty fast too. I have tested up to 1000 points. With rectangles, it kept 60FPS even at 1000, with circles with a segment value of 100 It kept 60FPS all the way up to 500 and gradually lowered to 30FPS when I got to 1000. Not too shabby. Should go super fast with quads and sprites.
Each point has a scale factor which could be used to draw sprites/quads at a scale you want as the number is between 0 and 1. And if you multiply the scale by the zoom you can scale them up even more.
Lines are drawn by the location (z-index) of their first point. So it's not true 3D. If I could break the lines into segments and draw them separately as other depths, it would look right, but also take up a lot of power. It's only a visual problem when you have many lines crossing at weird angles anyway. Obviously if I could I'd make the lines have depth too with them being thick in the foreground and thin in the back with a smooth transition from front to back. But I can't.
Since a point's X, Y and Z can be changed during runtime, and the lines attach themselves to the point's table index, you can move any part of the 3D model independently.
It has a secret filled triangle-based mode that is in the experimental stages right now. It's buggy in that the triangles don't seem to sort correctly so triangles get drawn overlapping other ones even though they're behind the others. This is because most of the time they share a single point and the sorting algorithm sorts them but can't distinguish if a set of points should be sorted behind another set. 3D is hard maths. Press "P" to show this mode. Take a look at my code, maybe someone can help figure out how to get the clipping to stop. If I don't first that is.
Press "N" to toggle the points ID numbers. Useful when making new triangles to figure out what points to connect.
Shame Löve can't take an image, mask it to a shape at the scale and rotation you want and draw it in a polygon area or else we could do some cool stuff.
I'd like to add shading next to make further back triangles darker. Should be easy. Maybe.
I would not be surprised if I somehow stumbled onto a way to make a StarFox (SNES) clone one day.
I wish polygons and circles were antialised like lines are. I faked it for now by overlapping a lined shape on a filled one. But I shouldn't have to.
Jasoco's 3D Engine Thread: Go to Page 6 Please!
- Jasoco
- Inner party member
- Posts: 3727
- Joined: Mon Jun 22, 2009 9:35 am
- Location: Pennsylvania, USA
- Contact:
Jasoco's 3D Engine Thread: Go to Page 6 Please!
- Attachments
-
- 3d.love
- Newell's Teapot now featured!
- (8.12 KiB) Downloaded 725 times
Last edited by Jasoco on Thu Nov 18, 2010 1:57 am, edited 9 times in total.
Re: On the subject of three-dimensions...
HOLY GOD ON A LOG!!!
That's pretty awesome stuff your playing with Jasoco.
I too have felt the anti-aliasing or... lack there of on poly/circles and have had to resort to using a lined version to add it in... I'm bleeding too bro.
You seriously need to try harder to `stumble` on a making a Starfox clone!!!!
That's pretty awesome stuff your playing with Jasoco.
I too have felt the anti-aliasing or... lack there of on poly/circles and have had to resort to using a lined version to add it in... I'm bleeding too bro.
You seriously need to try harder to `stumble` on a making a Starfox clone!!!!
My Development Diary - http://shanegadsby.info
- kikito
- Inner party member
- Posts: 3153
- Joined: Sat Oct 03, 2009 5:22 pm
- Location: Madrid, Spain
- Contact:
Re: On the subject of three-dimensions...
It is quite good looking. Congratulations!
Is there any chance that you include triangles, instead of just lines and dots?
Is there any chance that you include triangles, instead of just lines and dots?
When I write def I mean function.
- Jasoco
- Inner party member
- Posts: 3727
- Joined: Mon Jun 22, 2009 9:35 am
- Location: Pennsylvania, USA
- Contact:
Re: On the subject of three-dimensions...
Press P to show how buggy filled triangle mode is.
Since it's not real 3D, it doesn't have all the features a real 3D engine could have like backface culling and clipping. The best I can do is draw a triangle before I draw another as long as all the ones I draw first are behind the ones in the front.
Since it's not real 3D, it doesn't have all the features a real 3D engine could have like backface culling and clipping. The best I can do is draw a triangle before I draw another as long as all the ones I draw first are behind the ones in the front.
Re: On the subject of three-dimensions...
I bet there is some way of doing this correct, but I have no clue of how to...Jasoco wrote:The best I can do is draw a triangle before I draw another as long as all the ones I draw first are behind the ones in the front.
- Jasoco
- Inner party member
- Posts: 3727
- Joined: Mon Jun 22, 2009 9:35 am
- Location: Pennsylvania, USA
- Contact:
Re: On the subject of three-dimensions...
Doing a little debugging I see that my triangles "z index's" rapidly change places for some, I think when two or more share the same point they fight it out for superiority. If I can fix this jumping back and forth maybe I can get it to work right. It should end up working perfectly for simple 3D games that don't require too much going on at once. Even sprite-based 3D games should work fine. i.e. a flat ground with some people walking around and objects. If we could stretch images/quads between four points to make them look perspective, it could be pretty cool.
That's my goal today. To get the triangles to stop dancing.
Edit: Download the new version I just put up. It has debug text so you can see what I mean when I say jumping polygons.
That's my goal today. To get the triangles to stop dancing.
Edit: Download the new version I just put up. It has debug text so you can see what I mean when I say jumping polygons.
Re: On the subject of three-dimensions...
Wow it is much faster than i thought it would be. :
Awesome!
Awesome!
- Jasoco
- Inner party member
- Posts: 3727
- Joined: Mon Jun 22, 2009 9:35 am
- Location: Pennsylvania, USA
- Contact:
Re: On the subject of three-dimensions...
Hmm.. Backface culling is harder than it would seem.
http://gpwiki.org/index.php/3D:Backface_Culling
It doesn't seem to be working right so far for me. It works fine in this JavaScript 3D model viewer:
http://www.nihilogic.dk/labs/canvas3dtexture_0.2/
Which gets its idea from here:
http://www.kirupa.com/developer/actions ... ulling.htm
The code for determining if a face is facing forward or backward is:
But I can't figure out how I'd convert that to Lua. So I used the example from the GPWiki link above (First link) which uses this as its code:
I came up with this:
Which doesn't seem to work.
But another method would be to take the three points X and Y and figure out if they are in clockwise or counterclockwise order. But I have no idea how to do that.
So really, how do I determine if three points are in clockwise order? That will help determine if it is facing towards the camera or towards the back. If it is towards the camera, it is visible. If not, it is not.
Edit: Download the current version for debugging in the OP up top. Enjoy! And HELLLLLLP!!!!!
http://gpwiki.org/index.php/3D:Backface_Culling
It doesn't seem to be working right so far for me. It works fine in this JavaScript 3D model viewer:
http://www.nihilogic.dk/labs/canvas3dtexture_0.2/
Which gets its idea from here:
http://www.kirupa.com/developer/actions ... ulling.htm
The code for determining if a face is facing forward or backward is:
Code: Select all
if ((y3-y1)/(x3-x1) - (y2-y1)/(x2-x1) <= 0) ^ (x1 <= x3 == x1 > x2) {
Code: Select all
(p3 - p1) x (p3 - p2)
= ([0,0,0]-[1,1,0]) x ([0,0,0]-[2,0,0])
= [-1,-1,0] x [-2,0,0]
= [(-1*0)-(0*0), (0*2)-(1*0), (1*0)-(1*2)]
= [0-0, 0-0, 0-2]
= [0, 0, -2]
Code: Select all
((x3-x1)+(y3-y1)+(z3-z1)) * ((x3-x2)+(y3-y2)+(z3-z2))
But another method would be to take the three points X and Y and figure out if they are in clockwise or counterclockwise order. But I have no idea how to do that.
So really, how do I determine if three points are in clockwise order? That will help determine if it is facing towards the camera or towards the back. If it is towards the camera, it is visible. If not, it is not.
Edit: Download the current version for debugging in the OP up top. Enjoy! And HELLLLLLP!!!!!
Re: On the subject of three-dimensions...
For the record, this: in Lua would be this:
You could probably get rid of some of the parentheses, but that should work. (As the article explains, a bitwise xor is just a not-equals operation...)
Though your code looks a bit different from kirupa's. I see a < that became a <=, for example.
Code: Select all
if ((y3-y1)/(x3-x1) - (y2-y1)/(x2-x1) <= 0) ^ (x1 <= x3 == x1 > x2) {
Code: Select all
if ((y3-y1)/(x3-x1) - (y2-y1)/(x2-x1) <= 0) ~= ((x1 <= x3) == (x1 > x2)) then
Though your code looks a bit different from kirupa's. I see a < that became a <=, for example.
Re: On the subject of three-dimensions...
Cross product to the rescue. This is the first Google hit for the relevant search terms:Jasoco wrote:
But another method would be to take the three points X and Y and figure out if they are in clockwise or counterclockwise order. But I have no idea how to do that.
http://local.wasp.uwa.edu.au/~pbourke/g ... clockwise/
This presentation might be clearer:
http://www.lighthouse3d.com/opengl/math ... ossproduct
Who is online
Users browsing this forum: Bing [Bot] and 7 guests