Tricky math questions!

BlitzMax Forums/BlitzMax Beginners Area/Tricky math questions!

*(Posted 2007) [#1]
How do i show a 3d point on a 2d screen without using any 3d library, with distance too?

Also how do I calculate a objects 3d coordinates if I move it by so much for example (move from 0,0,0 at angle x,y,z would return the new position of the object)?

Thanks in advance :)


FlameDuck(Posted 2007) [#2]
You need to "project" the point onto the plane. http://en.wikipedia.org/wiki/3D_projection


*(Posted 2007) [#3]
Thanks will have a look, always been interested on simulating 3d without using one of the preset rendering systems :)


René(Posted 2007) [#4]
It's not so hard. Just divide the x and y coordinates with the z coordinate oft the 3D point to get the 2D x',y' coordinates:
x'=x/z
y'=y/z


*(Posted 2007) [#5]
Thanks René, would you perchance know the way to rotate the camera with the 3d point?


René(Posted 2007) [#6]
I don't really understand what you're after. Moving the 3D point in space?

Then next step would be using transformation matrices where it's getting a bit more complicated.


*(Posted 2007) [#7]
yeah moving the 3d point in space, ATM the code I have shows a 3d point on the screen now I would like to move around that 3d point if thats possible :).

As you have already guessed math is not my strong point, im more of an AI and logic person :)


René(Posted 2007) [#8]
Hm, I don't know if there is a smart way to fake 3D movement with a point. You can try to move the coordinates of the 3D point by user input. I.e.
Key Up - decreases z
Key Down - increases z
MouseMoveX - de/increases x
MouseMoveY - de/increases y

Then I would try to fake depth by making the point bigger the nearer you are to the point which means the nearer the z value is to zero the bigger the point. If z is negative the point is behind the camera (this is fake because a point is always the same size nevertheless how far away you are from that point).

If you want to make it correct (like a real 3D engine does), you will have to use vector and matrices math.


*(Posted 2007) [#9]
I see thanks will have a look at what I can come up with. I dont understand math much so vector and matrix math are beyond me :\


René(Posted 2007) [#10]
Here is a very poor 3d fake. Just to get an idea.
Use mouse and WASD.

SuperStrict


Graphics 1024, 768, 32

HideMouse

Type point
	Global pointList:TList
	Global mx%
	Global my%
	Global mxs%
	Global mys%
	
	Field x#
	Field y#
	Field z#
	Field maxsize# = 100
	
	Method New()
		If pointList = Null Then pointList = CreateList()
		ListAddLast pointList, Self
	End Method
	
	Function Create:point(_x#,_y#,_z#)
		Local p:point = New point
		p.x = _x
		p.y = _y
		p.z = _z
		Return p
	End Function
	
	Function CreateRandom(_max#=1000)
		Local x# = Rnd(-_max,_max)
		Local y# = Rnd(-_max,_max)
		Local z# = Rnd(-_max,_max)
						
		point.Create(x,y,z)
	End Function
	
	Method Draw()
		If Self.z < 0 Then Return	
	
		Local size# = Self.maxsize
		
		If Self.z >= 1
			size = Self.maxsize / (Self.z / 10.0)
		End If
		
		If size > Self.maxsize Then Return
		
		SetColor 255,255,255
		DrawOval Self.x -size/2, Self.y -size/2, size, size
	End Method
	
	Method Update()
		If KeyDown(KEY_W) Then Self.z:- 1
		If KeyDown(KEY_S) Then Self.z:+ 1
		If KeyDown(KEY_A) Then Self.x:+ 1 / (Self.z/1000.0)
		If KeyDown(KEY_D) Then Self.x:- 1 / (Self.z/1000.0)
		
		Self.x:+ Float(mxs) / (Self.z/1000.0)
		Self.y:+ Float(mys) / (Self.z/1000.0)		
	End Method
	
	Function UpdateAll()
		mxs = mx - MouseX()
		mys = my - MouseY()
		mx = MouseX()
		my = MouseY()
			
		If pointList = Null Then Return		
		For Local p:point = EachIn pointList
			p.Update()
			p.Draw()
		Next
	End Function
End Type




For Local i:Int = 0 To 1000
	point.CreateRandom()
Next




While Not KeyHit(KEY_ESCAPE) And Not AppTerminate()
Cls

	point.UpdateAll()

Flip
Wend
End




Hotshot2005(Posted 2007) [#11]
IT show simple example on where the x,y,z is

http://www.coolmath.com/coolthings/3dwireframe/index.html

Hope that help.

cheers


*(Posted 2007) [#12]
Thanks guys I will have a look, René thanks for the example I will have a tinker around and see what I can come up with :)