It looks like you're new here. If you want to get involved, click one of these buttons!

- 141.6K All Categories
- 104.7K Programming Languages
- 6.4K Assembler Developer
- 1.9K Basic
- 39.8K C and C++
- 4.3K C#
- 7.9K Delphi and Kylix
- 4 Haskell
- 9.6K Java
- 4.1K Pascal
- 1.3K Perl
- 2K PHP
- 518 Python
- 37 Ruby
- 4.3K VB.NET
- 1.6K VBA
- 20.8K Visual Basic
- 2.6K Game programming
- 312 Console programming
- 89 DirectX Game dev
- 1 Minecraft
- 110 Newbie Game Programmers
- 2 Oculus Rift
- 8.9K Applications
- 1.8K Computer Graphics
- 730 Computer Hardware
- 3.4K Database & SQL
- 522 Electronics development
- 1.6K Matlab
- 628 Sound & Music
- 257 XML Development
- 3.3K Classifieds
- 196 Co-operative Projects
- 185 For sale
- 189 FreeLance Software City
- 1.9K Jobs Available
- 600 Jobs Wanted
- 201 Wanted
- 2.9K Microsoft .NET
- 1.7K ASP.NET
- 1.1K .NET General
- 3.3K Miscellaneous
- 4 Join the Team
- 0 User Profiles
- 353 Comments on this site
- 60 Computer Emulators
- 2.1K General programming
- 183 New programming languages
- 604 Off topic board
- 170 Mobile & Wireless
- 44 Android
- 124 Palm Pilot
- 335 Multimedia
- 151 Demo programming
- 184 MP3 programming
- 0 Bash scripts
- 19 Cloud Computing
- 53 FreeBSD
- 1.7K LINUX programming
- 367 MS-DOS
- 0 Shell scripting
- 320 Windows CE & Pocket PC
- 4.1K Windows programming
- 895 Software Development
- 408 Algorithms
- 68 Object Orientation
- 89 Project Management
- 90 Quality & Testing
- 239 Security
- 7.6K WEB-Development
- 1.8K Active Server Pages
- 61 AJAX
- 2 Bootstrap Themes
- 55 CGI Development
- 19 ColdFusion
- 222 Flash development
- 1.4K HTML & WEB-Design
- 1.4K Internet Development
- 2.2K JavaScript
- 34 JQuery
- 286 WEB Servers
- 151 WEB-Services / SOAP

Lopez
Posts: **75**Member

I've coded a 3D plotter, which takes the 3 x,y,z co-ordinates and puts them to the screen. I've made a cube but I can only move the camera x,y,z I want to make the camera be able to rotate it's viewpoint along x axis (or y axis, both are the same), what is the technique for doing this?

or the technique for rotating the cube?

Someone must know the technique, I've seen so many rotating cube demos in my life. Does it involve the equation of a circle?

or the technique for rotating the cube?

Someone must know the technique, I've seen so many rotating cube demos in my life. Does it involve the equation of a circle?

Terms of use / Privacy statement / Publisher: Lars Hagelin

Programmers Heaven articles / Programmers Heaven files / Programmers Heaven uploaded content / Programmers Heaven C Sharp ebook / Operated by CommunityHeaven LLC

© 1997-2015 Programmersheaven.com - All rights reserved.

## Comments

75MemberUm, I think this is right anyway, see if I can get it right now.

22MemberA little trig:

x=r*cos(a)

y=r*sin(a)

[x^2+y^2=(r*cos(a))^2+(r*sin(a))^2 ;normal/polar circle eq]

Now we do a rotation of angle b:

x=r*cos(a+b); [cos(a+b)=cos(a)*cos(b)-sin(a)*sin(b)]

y=r*sin(a+b); [sin(a+b)=sin(a)*cos(b)+cos(a)*sin(b)]

x=r*cos(a)+cos(b)-r*sin(a)*sin(b); [r*cos(a)=x, r*sin(a)=y]

y=r*sin(a)+cos(b)+r*cos(a)*sin(b); [r*cos(a)=x, r*sin(a)=y]

Finally:

x=x*cos(b)-y*sin(b)

y=x*sin(b)+y*cos(b)

Now if we look from -Z to +Z we see:

X

|_Y 2Dplane(x,y)

From -X to +X:

Z

|_Y 2Dplane(y,z)

From -Y to +Y:

X

|_Z 2Dplane(z,x)

Then the rotation around X-Axis of angle ax:

x=x

y=y*cos(ax)-z*sin(ax)

z=y*sin(ax)+z*cos(ax)

Y-Axis ay:

x=z*sin(ay)+x*cos(ay)

y=y

z=z*cos(ay)-x*sin(ay)

Z-Axis az:

x=x*cos(az)-y*sin(az)

y=x*sin(az)+y*cos(az)

z=z

2-Axis rotation takes: 8 mul, 2 add, 2 sub per point

Rotate of 25 on ax then 30 on ay, or first 30 on ay then 25 on ax dont change the result, so the order we rotate ours point dont actually matter.

Matrix: Rotate using a matrix

Z-Axis: (that u dont need but it's simple to understand)

x=x*( cos(az)) + y*(-sin(az)) + z*0

y=x*( sin(az)) + y*( cos(az)) + z*0

z=x*0 + y*0 + z*1

This sys of eq. can be express as the multiplication betwenn a 3x3 matrix and a 3D vector:

V'=Rz*V; [Rz:matrix, V:vector, V':rotated vector]

The coefficent of Rz are:

Rz0=cos(az), Rz1=-sin(az), Rz2=0,

Rz3=sin(az), Rz4=cos(az), Rz5=0,

Rz6=0, Rz7=0, Rz8=1

where:

x = x*Rz0 + y*Rz1 + z*Rz2

y = x*Rz3 + y*Rz4 + z*Rz5

z = x*Rz6 + y*Rz7 + z*Rz8

The coefficent of Ry:

Ry0=cos(ay), Rz1=0, Rz2=sin(ay),

Ry3=0, Rz4=1, Rz5=0,

Ry6=-sin(ay), Rz7=0, Rz8=cos(ay)

The coefficent of Rx:

Rx0=1, Rz1=0, Rz2=0,

Rx3=0, Rz4=cos(ax), Rz5=-sin(ax),

Rx6=0, Rz7=sin(ax), Rz8=cos(ay)

The multiplication of two matrixs create a thirth matrix that does the both 3d trasformation in the order of the multiplication, with rotation dosn't really matter but with matrixs u can perfor other 3D traformation where the order is important indeed.

Rx*Ry=Rxy:

Rxy0 = Rx0*Ry0 + Rx1*Ry3 + Rx2*Ry6

Rxy1 = Rx0*Ry1 + Rx1*Ry4 + Rx2*Ry7

Rxy2 = Rx0*Ry2 + Rx1*Ry5 + Rx2*Ry8

Rxy3 = Rx3*Ry0 + Rx4*Ry3 + Rx5*Ry6

Rxy4 = Rx3*Ry1 + Rx4*Ry4 + Rx5*Ry7

Rxy5 = Rx3*Ry2 + Rx4*Ry5 + Rx5*Ry8

Rxy6 = Rx6*Ry0 + Rx7*Ry3 + Rx8*Ry6

Rxy7 = Rx6*Ry1 + Rx7*Ry4 + Rx8*Ry7

Rxy8 = Rx6*Ry2 + Rx7*Ry5 + Rx8*Ry8

Ok sounds bad but it isn't really

Rxy0=cos(ay)

Rxy1=0

Rxy2=sin(ay)

Rxy3=sin(ax)*sin(ay)

Rxy4=cos(ax)

Rxy5=-sin(ax)*cos(ay)

Rxy6=-cos(ax)*sin(ay)

Rxy7=sin(ax)

Rxy8=cos(ax)*cos(ay)

where:

x = x*Rxy0 + y*0 + z*Rxy2 = x*Rxy0 + z*Rxy2

y = x*Rxy3 + y*Rxy4 + z*Rxy5

z = x*Rxy6 + y*Rxy7 + z*Rxy8

2-Axis matrix rotation takes: 8 mul, 5 add per point

The camera:

The rotation for the camera it's done in the same way, but we need to rotate the world around the negative camera's angles.

Just need to know that: cos(-a)=cos(a), sin(-a)=-sin(a)

cam_Rxy0=cos(ay)

cam_Rxy1=0

cam_Rxy2=-sin(ay)

cam_Rxy3=sin(ax)*sin(ay)

cam_Rxy4=cos(ax)

cam_Rxy5=sin(ax)*cos(ay)

cam_Rxy6=cos(ax)*sin(ay)

cam_Rxy7=-sin(ax)

cam_Rxy8=cos(ax)*cos(ay)

Here the matrix's way seems to be more complicated without gaining speed from it, but where u will facing 3-axis matrix rotation, then later use to describe on a 3d space an object or a camera a 4x4 matrix, it will be clear that the matrix's way is much better.

I suggest you to use and learn how to handle it.

Mutilate[OA]