| 3D Code Help 
 
	 
	
		| Author | Message |   
		| SNIPERDUDE 
 
  
 
 
 | 
			
				|  Posted: Thu Aug 28, 2008 8:35 am    Post subject: 3D Code Help |  |   
				| 
 |  
				| Ok, so I have the basics of 3D.  I think it's right... Anyways I have hit another snag, how do I make it so I can fill in
 faces or make it so some lines are hidden (when behind another face)?
 
 Here's what I have so far:
 
 
 	  | Turing: |  	  | 
View.Set ("graphics")
View.Set ("offscreenonly")
colorback (120)
const depth := 10
fcn  divi ( x, y : real) : real
    if  y = 0 then
        result 9999999
    else
        result ( x / y)
    end if
end  divi
proc  drawdot3d ( x, y, z : real , c : int)
    drawdot (round ( divi ( x, z / depth)  + maxx  / 2)  - 1 , round ( divi ( y, z / depth)  + maxy  / 2)  - 1 , c)
end  drawdot3d
proc  drawline3d ( x1, y1, z1, x2, y2, z2 : real , c : int)
    drawline (round ( divi ( x1, z1 / depth)  + maxx  / 2), round ( divi ( y1, z1 / depth)  + maxy  / 2), round ( divi ( x2, z2 / depth)  + maxx  / 2), round ( divi ( y2, z2 / depth)  + maxy  / 2),  c)
end  drawline3d
var  h : real :=  -10
var  xe : int := 100
var  ye : int := 100
var  w : int := 50
var  key : array char of boolean
type  Vert :
    record 
        X, Y : int 
        Z : real
    end record
   
type  LineProp :
    record 
        P1, P2, Clr : int
    end record
var  Point : array 1 . . 100 of  Vert
var  Line : array 1 . . 100 of  LineProp
for  i : 1 . . 100 
    Point( i) .X := 0 
    Point( i) .Y := 0 
    Point( i) .Z := 0 
    Line( i) .P1 := 0 
    Line( i) .P2 := 0
end for
%% House Properties 
Point(1) .X := 0 
Point(1) .Y := 0 
Point(1) .Z := 0 
Point(2) .X := 0 
Point(2) .Y := 50 
Point(2) .Z := 0 
Point(3) .X := 50 
Point(3) .Y := 50 
Point(3) .Z := 0 
Point(4) .X := 50 
Point(4) .Y := 0 
Point(4) .Z := 0 
Point(5) .X := 0 
Point(5) .Y := 0 
Point(5) .Z := 1 
Point(6) .X := 0 
Point(6) .Y := 50 
Point(6) .Z := 1 
Point(7) .X := 50 
Point(7) .Y := 50 
Point(7) .Z := 1 
Point(8) .X := 50 
Point(8) .Y := 0 
Point(8) .Z := 1 
Point(9) .X := 25 
Point(9) .Y := 0 
Point(9) .Z := 1 .2 
Point(10) .X := 25 
Point(10) .Y := 50 
Point(10) .Z := 1 .2 
Point(11) .X := 0 
Point(11) .Y := 30 
Point(11) .Z := 0 .5 
Point(12) .X := 0 
Point(12) .Y := 20 
Point(12) .Z := 0 .5 
Point(13) .X := 0 
Point(13) .Y := 30 
Point(13) .Z := 0 
Point(14) .X := 0 
Point(14) .Y := 20 
Point(14) .Z := 0 
Line(1) .P1 := 1 
Line(1) .P2 := 4 
Line(1) .Clr := 0 
Line(2) .P1 := 1 
Line(2) .P2 := 2 
Line(2) .Clr := 0 
Line(3) .P1 := 2 
Line(3) .P2 := 3 
Line(3) .Clr := 0 
Line(4) .P1 := 3 
Line(4) .P2 := 4 
Line(4) .Clr := 0 
Line(5) .P1 := 5 
Line(5) .P2 := 6 
Line(5) .Clr := 0 
Line(6) .P1 := 6 
Line(6) .P2 := 10 
Line(6) .Clr := 0 
Line(7) .P1 := 10 
Line(7) .P2 := 7 
Line(7) .Clr := 0 
Line(8) .P1 := 7 
Line(8) .P2 := 8 
Line(8) .Clr := 0 
Line(9) .P1 := 8 
Line(9) .P2 := 9 
Line(9) .Clr := 0 
Line(10) .P1 := 9 
Line(10) .P2 := 5 
Line(10) .Clr := 0 
Line(11) .P1 := 9 
Line(11) .P2 := 10 
Line(11) .Clr := 0 
Line(12) .P1 := 1 
Line(12) .P2 := 5 
Line(12) .Clr := 0 
Line(13) .P1 := 2 
Line(13) .P2 := 6 
Line(13) .Clr := 0 
Line(14) .P1 := 3 
Line(14) .P2 := 7 
Line(14) .Clr := 0 
Line(15) .P1 := 4 
Line(15) .P2 := 8 
Line(15) .Clr := 0 
Line(16) .P1 := 11 
Line(16) .P2 := 12 
Line(16) .Clr := brightred 
Line(17) .P1 := 12 
Line(17) .P2 := 14 
Line(17) .Clr := brightred 
Line(18) .P1 := 13 
Line(18) .P2 := 11 
Line(18) .Clr := brightred
proc  draw ( xe : int)
for  i : 1 . . 100
    if  Line( i) .P1 = 0 and  Line( i) .P2 = 0 then
        exit
    else 
        drawline3d ( xe + Point( Line( i) .P1) .X, ye + Point( Line( i) .P1) .Y, h + Point( Line( i) .P1) .Z, xe + Point( Line( i) .P2) .X, ye + Point( Line( i) .P2) .Y, h + Point( Line( i) .P2) .Z, Line( i) .Clr)
    end if
end for
end  draw
loop
    Input.KeyDown ( key)
    
    if  key (KEY_UP_ARROW) then 
        ye += 3
    elsif  key (KEY_DOWN_ARROW) then 
        ye -= 3
    end if
    
    if  key (KEY_RIGHT_ARROW) then 
        xe += 3
    elsif  key (KEY_LEFT_ARROW) then 
        xe -= 3
    end if
    
    if  key ('w') then 
        h += 0 .1
    elsif  key ('s') then 
        h -= 0 .1
    end if
    
    drawfillbox (0 , 0 , maxx , maxy , 7) 
    draw ( xe)
    View.Update
    delay(10)
    exit when  key (KEY_ESC)
end loop | 
 
 Use the arrow keys to move the house around, the 'W' key to zoom in, and the 'S' key to zoom out.
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Sponsor Sponsor
 
  
   |  |   
		|  |   
		| Clayton 
 
  
 
 
 | 
			
				|  Posted: Thu Aug 28, 2008 9:33 am    Post subject: RE:3D Code Help |  |   
				| 
 |  
				| 10 million isn't exactly a very good estimate of x/0, I suggest you go with something bigger, like maxint. |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Zren 
 
  
 
 
 |  |   
		|  |  |  
	  
		|  |   
		| SNIPERDUDE 
 
  
 
 
 | 
			
				|  Posted: Thu Aug 28, 2008 5:02 pm    Post subject: RE:3D Code Help |  |   
				| 
 |  
				| Thanks guys, no time to look at it now... I'll let you know how it goes when I have the time to look at it...
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| CodeMonkey2000 
 
 
 
 
 | 
			
				|  Posted: Thu Aug 28, 2008 11:04 pm    Post subject: RE:3D Code Help |  |   
				| 
 |  
				| I think that using the z-buffer algorithm might be easier and the most correct, but since you can't use a graphics accelerator it will be VERY slow. 
 Striahgt from gamedev:
 
 	  | code: |  	  | Clear Z-Buffer to a certain value
 For every polygon
 For every scanline of that polygon
 For every pixel
 If this is nearest pixel {
 Write Pixel
 Write Z into zbuffer
 }
 End
 End
 End
 
 | 
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| SNIPERDUDE 
 
  
 
 
 | 
			
				|  Posted: Fri Aug 29, 2008 6:47 am    Post subject: RE:3D Code Help |  |   
				| 
 |  
				| Thought about that one. Would it run at any good speed in C++?
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| CodeMonkey2000 
 
 
 
 
 | 
			
				|  Posted: Fri Aug 29, 2008 10:33 am    Post subject: RE:3D Code Help |  |   
				| 
 |  
				| Well if you are using openGL, it does it itself, just enable GL_DEPTH_TEST and make sure you clear the depth buffer. OpenGL can do it faster too since it uses hardware acceleration, you don't need to use the painter's algorithm in openGL, since it's not that much faster anyway. |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| SNIPERDUDE 
 
  
 
 
 | 
			
				|  Posted: Fri Aug 29, 2008 6:44 pm    Post subject: RE:3D Code Help |  |   
				| 
 |  
				| Meh, first I'll think I'll try learning the painter's algorithm before I try learning other languages... |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Sponsor Sponsor
 
  
   |  |   
		|  |   
		|  |  
 |