I noticed many people ask how to rotate the camera about an object. Well, I decided to help you guys. In part 1 we will treat a normal rotation on the Y-axis (we set the x and z position). I’ll use VB.Net, because it’s easily portable to both C# and VB6. I also use radians instead of degrees since it’s both TrueVision3D and .NET’s native angle system. You should be able to convert it to degrees without too much hassle though.
First some maths. We’re going to use the formula
x(t) = cos(t) * r y(t) = sin(t) * r
This code is able to compute any position within radius ‘r’. where ‘t’ represents our time unit. X and Y represent the resulting positions. The reason why it produces a circle is a bit complex and the answer lies inside cosinus and sinus.
We will only need a few objects. A TVEngine, TVMesh and a TVScene. Let’s declare them
Dim tv As TrueVision3D.TVEngine Dim scene As TrueVision3D.TVScene Dim mesh As TrueVision3D.TVMesh
We also need some vars for our maths.
Dim t As Single Dim x As Single Dim y As Single Dim Const r As Single = 9
t=time unit x=pos x returned by cos(t) * r y=pos z returned by sin(t) * r r=radius
Ok, now do some initialization
'init tv tv = New TrueVision3D.TVEngine tv.SetAngleSystem(TrueVision3D.CONST_TV_ANGLE.TV_ANGLE_RADIAN) tv.Init3DWindowedMode(Me.Handle) tv.DisplayFPS = True 'init scene scene = New TrueVision3D.TVScene scene.GetCamera.SetLookAt(0, 0, 0) 'create the mesh mesh = scene.CreateMeshBuilder("teapot") mesh.CreateTeapot()
You should be able to understand everything above. Now we’re going to write the render loop:
Do While True tv.Clear() 'render our teapot mesh.Render() t = t + (tv.TimeElapsed / 814) 'calculate new values for x and z ' var x = pos z ' var y = pos x x = Math.Cos(t) * r y = Math.Sin(t) * r 'set camera scene.GetCamera.SetPosition(y, 0, x) scene.GetCamera.SetLookAt(0, 0, 0) tv.RenderToScreen() Application.DoEvents() Loop
the really important lines are these two:
x = Math.Cos(t) * r y = Math.Sin(t) * r
these describe the formula which is handled above. It takes the cosinus of out ‘time unit’, and multiplies it by the radius. Later we assign them to our X and Z position of the camera. After that we reset the camera lookat to the coord (0,0,0), so it keeps looking at the same spot.
also very important is this line:
t = t + (tv.TimeElapsed / 814)
it calculates the incremental of ‘t’ (tv.TimeElapsed / 814), and than adds it to ‘t’. The value 814 is calculated by me, it represents a fast rotation. You may need some tweaking here.
When you run the code you’ll find yourself spinning around a white teapot.