/******************************************************************************* * Spin3d - Handles nice trackball style camera movement in Processing * - based on Matrix3D code from cello3d by Marcello ********************************************************************************/ public class Spin3d { float x= 0, y = 0; float tdx = 0, tdy = 0; float dx = tdx, dy = tdy; //int pmouseX,pmouseY; public void mouseMoved() { // GOTCHA: x and y are switched! tdx=(mouseY-pmouseY); tdy=(mouseX-pmouseX); // pmouseX=mouseX; // pmouseY=mouseY; } public void apply() { ((PGraphics3)g). applyMatrix(m_0_0, m_0_1, m_0_2, m_0_3, m_1_0, m_1_1, m_1_2, m_1_3, m_2_0, m_2_1, m_2_2, m_2_3, m_3_0, m_3_1, m_3_2, m_3_3); } void update() { x += dx; y += dy; dx += (tdx-dx)/20; dy += (tdy-dy)/20; tdx += (0-tdx)/20; tdy += (0-tdy)/20; rotateX(dx); rotateY(dy); } public Spin3d() { } public float m_0_0 = 1, m_0_1 = 0, m_0_2 = 0, m_0_3 = 0, m_1_0 = 0, m_1_1 = 1, m_1_2 = 0, m_1_3 = 0, m_2_0 = 0, m_2_1 = 0, m_2_2 = 1, m_2_3 = 0, m_3_0 = 0, m_3_1 = 0, m_3_2 = 0, m_3_3 = 1; public void rotateX(float t) { if (t==0) return; float sin = sin(t); float cos = cos(t); transform( 1, 0, 0, 0, 0, cos, sin, 0, 0, -sin,cos, 0, 0, 0, 0, 1 ); } public void rotateY(float t) { if (t==0) return; float sin = sin(t); float cos = cos(t); transform( cos, 0, sin, 0, 0, 1, 0, 0, -sin,0, cos, 0, 0, 0, 0, 1 ); } public void transform(float nm_0_0, float nm_0_1, float nm_0_2, float nm_0_3, float nm_1_0, float nm_1_1, float nm_1_2, float nm_1_3, float nm_2_0, float nm_2_1, float nm_2_2, float nm_2_3, float nm_3_0, float nm_3_1, float nm_3_2, float nm_3_3) { Spin3d m = new Spin3d(); m.m_0_0 = m_0_0; m.m_0_1 = m_0_1; m.m_0_2 = m_0_2; m.m_0_3 = m_0_3; m.m_1_0 = m_1_0; m.m_1_1 = m_1_1; m.m_1_2 = m_1_2; m.m_1_3 = m_1_3; m.m_2_0 = m_2_0; m.m_2_1 = m_2_1; m.m_2_2 = m_2_2; m.m_2_3 = m_2_3; m.m_3_0 = m_3_0; m.m_3_1 = m_3_1; m.m_3_2 = m_3_2; m.m_3_3 = m_3_3; m_0_0 = nm_0_0*m.m_0_0 + nm_0_1*m.m_1_0 + nm_0_2*m.m_2_0; m_0_1 = nm_0_0*m.m_0_1 + nm_0_1*m.m_1_1 + nm_0_2*m.m_2_1; m_0_2 = nm_0_0*m.m_0_2 + nm_0_1*m.m_1_2 + nm_0_2*m.m_2_2; m_0_3 = nm_0_0*m.m_0_3 + nm_0_1*m.m_1_3 + nm_0_2*m.m_2_3 + nm_0_3; m_1_0 = nm_1_0*m.m_0_0 + nm_1_1*m.m_1_0 + nm_1_2*m.m_2_0; m_1_1 = nm_1_0*m.m_0_1 + nm_1_1*m.m_1_1 + nm_1_2*m.m_2_1; m_1_2 = nm_1_0*m.m_0_2 + nm_1_1*m.m_1_2 + nm_1_2*m.m_2_2; m_1_3 = nm_1_0*m.m_0_3 + nm_1_1*m.m_1_3 + nm_1_2*m.m_2_3 + nm_1_3; m_2_0 = nm_2_0*m.m_0_0 + nm_2_1*m.m_1_0 + nm_2_2*m.m_2_0; m_2_1 = nm_2_0*m.m_0_1 + nm_2_1*m.m_1_1 + nm_2_2*m.m_2_1; m_2_2 = nm_2_0*m.m_0_2 + nm_2_1*m.m_1_2 + nm_2_2*m.m_2_2; m_2_3 = nm_2_0*m.m_0_3 + nm_2_1*m.m_1_3 + nm_2_2*m.m_2_3 + nm_2_3; } }