Changeset 803 for trunk/geant4/visualization/OpenGL
- Timestamp:
- May 20, 2008, 7:10:00 PM (16 years ago)
- Location:
- trunk/geant4/visualization/OpenGL
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/geant4/visualization/OpenGL/include/G4OpenGLQtViewer.hh
r801 r803 107 107 void G4keyPressEvent (QKeyEvent * event); 108 108 void rotateQtScene(float, float); 109 void rotateSceneInventor(float,float,float);110 void rotateSceneTest(float,float,float);111 void rotateSceneTest2(float,float,float);112 109 void rotateQtCamera(float, float); 113 110 void moveScene(float, float, float,bool); -
trunk/geant4/visualization/OpenGL/src/G4OpenGLQtViewer.cc
r802 r803 1668 1668 fHoldRotateEvent = true; 1669 1669 1670 rotateSceneTest2(dx,dy,fDeltaRotation); 1671 // rotateScene(dx,0,fDeltaRotation); 1672 // rotateScene(0,dy,fDeltaRotation); 1670 rotateScene(dx,0,fDeltaRotation); 1671 rotateScene(0,dy,fDeltaRotation); 1673 1672 1674 1673 updateQWidget(); … … 1688 1687 fHoldRotateEvent = true; 1689 1688 1690 rotateSceneTest2(dx,dy,fDeltaRotation); 1691 // rotateScene(dx,dy,fDeltaRotation); 1689 rotateScene(dx,dy,fDeltaRotation); 1692 1690 updateQWidget(); 1693 1691 … … 1696 1694 1697 1695 1698 void G4OpenGLQtViewer::rotateSceneTest2(float dx, float dy,float deltaRot) 1699 { 1700 fDeltaRotationAngleX = dx; 1701 fDeltaRotationAngleY = dy; 1702 // rotateScene(dx,dy,fDeltaRotation); 1703 1704 const G4Point3D targetPoint 1705 = fSceneHandler.GetScene()->GetStandardTargetPoint() 1706 + fVP.GetCurrentTargetPoint (); 1707 G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius(); 1708 if(radius<=0.) radius = 1.; 1709 const G4double cameraDistance = fVP.GetCameraDistance (radius); 1710 const G4Point3D cameraPosition = 1711 targetPoint + cameraDistance * fVP.GetViewpointDirection().unit(); 1712 G4Vector3D up = fVP.GetUpVector ().unit (); 1713 G4Vector3D new_dx ; 1714 G4Vector3D new_cameraPosition ; 1715 G4Vector3D new_up ; 1716 G4Vector3D delta ; 1717 G4double new_cameraDistance; 1718 G4Vector3D deltaCp; 1719 G4Vector3D deltaUp; 1720 1721 new_dx[2] = (cameraPosition[0]*up[1]-cameraPosition[1]*up[0]); 1722 new_dx[0] = (cameraPosition[1]*up[2]-cameraPosition[2]*up[1]); 1723 new_dx[1] = (cameraPosition[2]*up[0]-cameraPosition[0]*up[2]); 1724 1725 delta = -new_dx*dx*deltaRot/45 - up*cameraDistance*dy*deltaRot/45; // 1 unit equal 45 degrees 1726 new_cameraPosition = cameraPosition + delta; 1727 1728 new_cameraDistance = std::sqrt(new_cameraPosition[0]*new_cameraPosition[0]+new_cameraPosition[1]*new_cameraPosition[1]+new_cameraPosition[2]*new_cameraPosition[2]); 1729 deltaCp = cameraDistance*(cameraPosition/new_cameraDistance)-cameraPosition; 1730 new_cameraPosition = new_cameraPosition + deltaCp; 1731 delta += deltaCp; 1732 1733 /* *********************** */ 1734 G4Vector3D new_UpX; 1735 new_UpX[2] = (-up[0]*cameraPosition[1]+up[1]*cameraPosition[0])/(cameraDistance*cameraDistance); 1736 new_UpX[0] = (-up[1]*cameraPosition[2]+up[2]*cameraPosition[1])/(cameraDistance*cameraDistance); 1737 new_UpX[1] = (-up[2]*cameraPosition[0]+up[0]*cameraPosition[2])/(cameraDistance*cameraDistance); 1738 G4Vector3D deltaX; 1739 G4Vector3D deltaUpX; 1740 deltaX = -new_UpX*dx*deltaRot/45 - (-cameraPosition/cameraDistance)*cameraDistance*dy*deltaRot/45; 1741 new_up = up+deltaX; 1742 1743 float new_upDist; 1744 new_upDist = std::sqrt(new_up[0]*new_up[0]+new_up[1]*new_up[1]+new_up[2]*new_up[2]); 1745 deltaUpX = (up/new_upDist)-up; 1746 new_up += deltaUpX; 1747 1748 1749 // new_up = up[0]+ 1750 1751 // new_up[1] = up[1]*((new_cameraPosition[1])/cameraDistance)/cameraPosition[0]; 1752 // new_up[1] = up[1]*((new_cameraPosition[1])/cameraDistance)/cameraPosition[0]; 1753 // new_up[2] = up[2]-delta[1]/cameraDistance ; 1754 // new_up[2] = new_cameraPosition[0]*(-delta[1])-new_cameraPosition[1]*(-delta[0]); 1755 // new_up[0] = new_cameraPosition[1]*(-delta[2])-new_cameraPosition[2]*(-delta[1]); 1756 // new_up[1] = new_cameraPosition[2]*(-delta[0])-new_cameraPosition[0]*(-delta[2]); 1757 1758 1759 #ifdef GEANT4_QT_DEBUG 1760 printf(" Cp %f %f %f\tup:%f %f %f \tdx: %f %f %f\tTp %f %f %f\t\n", 1761 cameraPosition[0],cameraPosition[1],cameraPosition[2],up[0],up[1],up[2],new_dx[0],new_dx[1],new_dx[2],targetPoint[0],targetPoint[1],targetPoint[2]); 1762 printf(" Np %f %f %f\tnew_up: %f %f %f\tdelta: %f %f %f\tCd: %f\n", 1763 new_cameraPosition[0],new_cameraPosition[1],new_cameraPosition[2],new_up[0],new_up[1],new_up[2],delta[0],delta[1],delta[2],cameraDistance); 1764 printf(" DCp: %f %f %f\tNewUpX:%f %f %f\t deltaX:%f %f %f newUpDist:%f\n",deltaCp[0],deltaCp[1],deltaCp[2],new_UpX[0],new_UpX[1],new_UpX[2],deltaX[0],deltaX[1],deltaX[2],new_upDist); 1765 #endif 1766 1767 fVP.SetUpVector(new_up); 1768 fVP.SetViewAndLights (new_cameraPosition); 1769 } 1770 1771 void G4OpenGLQtViewer::rotateSceneTest(float dx, float dy,float delta) 1772 { 1773 fDeltaRotationAngleX = dx; 1774 fDeltaRotationAngleY = dy; 1775 1776 float cox = std::cos ((fRotationAngleX*M_PI)/180); 1777 float coy = std::cos ((fRotationAngleY*M_PI)/180); 1778 float coz = 1; 1779 float six = std::sin ((fRotationAngleX*M_PI)/180); 1780 float siy = std::sin ((fRotationAngleY*M_PI)/180); 1781 float siz = 0; 1782 1783 float dx2 = coy*(siz*dy+coz*dx); 1784 float dy2 = six*(siy*(siz*dy+coz*dx))+cox*(coz*dy-siz*dx); 1785 float dz2 = cox*(siy*(siz*dy+coz*dx))-six*(coz*dy-siz*dx); 1786 1787 #ifdef GEANT4_QT_DEBUG 1788 printf("G4OpenGLQtViewer::MouseMove %f,%f Rot:%f,%f new : %f %f %f\n",dx,dy,fRotationAngleX,fRotationAngleY,dx2,dy2,dz2); 1789 #endif 1790 1791 fDeltaRotationAngleX = dx2; 1792 fDeltaRotationAngleY = dy2; 1793 fDeltaRotationAngleZ = dz2; 1794 1795 } 1796 1797 void G4OpenGLQtViewer::rotateSceneInventor(float dx, float dy,float delta) 1798 { 1799 // __________________________ 1800 // From Inventor 1801 // -------------------------- 1802 //SoGuiExaminerViewerP::rotateCamera(SoCamera * cam, 1803 // const SbVec3f & aroundaxis, 1804 // const float delta) 1805 1806 // position of camera 1807 /* 1808 const G4Point3D targetPoint 1809 = fSceneHandler.GetScene()->GetStandardTargetPoint() 1810 + fVP.GetCurrentTargetPoint (); 1811 G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius(); 1812 if(radius<=0.) radius = 1.; 1813 const G4double cameraDistance = fVP.GetCameraDistance (radius); 1814 const G4Point3D cameraPosition = 1815 targetPoint + cameraDistance * fVP.GetViewpointDirection().unit(); 1816 1817 // 1818 1819 G4Point3D currentdir = fVP.GetViewpointDirection().unit(); 1820 1821 const G4Point3D focalpoint = cameraPosition + 1822 cameraDistance * currentdir; 1823 1824 // set new orientation 1825 float rotation[4]; 1826 float quatRotationX[4]; 1827 1828 // from SbRotation::setValue(axis,radians) 1829 this->quatRotationX[3] = (float)cos(radians/2); 1830 const float sineval = (float)sin(radians/2); 1831 G4Point3D a = axis; 1832 // we test for a null vector above 1833 (void) a.normalize(); 1834 this->quatRotationX[0] = a[0] * sineval; 1835 this->quatRotationX[1] = a[1] * sineval; 1836 this->quatRotationX[2] = a[2] * sineval; 1837 1838 // from SbRotation operator * 1839 currentdir 1840 float currentdir[0], currentdir[1], currentdir[2], currentdir[3]; 1841 q.getValue(currentdir[0], currentdir[1], currentdir[2], currentdir[3]); 1842 1843 this->setValue(currentdir[3]*quatRotationX[0] + currentdir[0]*quatRotationX[3] + currentdir[1]*quatRotationX[2] - currentdir[2]*quatRotationX[1], 1844 currentdir[3]*quatRotationX[1] - currentdir[0]*quatRotationX[2] + currentdir[1]*quatRotationX[3] + currentdir[2]*quatRotationX[0], 1845 currentdir[3]*quatRotationX[2] + currentdir[0]*quatRotationX[1] - currentdir[1]*quatRotationX[0] + currentdir[2]*quatRotationX[3], 1846 currentdir[3]*quatRotationX[3] - currentdir[0]*quatRotationX[0] - currentdir[1]*quatRotationX[1] - currentdir[2]*quatRotationX[2]); 1847 1848 1849 // cam->orientation = SbRotation(aroundaxis, delta) * currentorientation; 1850 1851 SbVec3f newdir; 1852 cam->orientation.getValue().multVec(DEFAULTDIRECTION, newdir); 1853 cam->position = focalpoint - cam->focalDistance.getValue() * newdir; 1854 1855 // __________________________ 1856 // END From Inventor 1857 // -------------------------- 1858 */ 1859 } 1860 1861 /* 1862 float[4] G4OpenGLQtViewer::makeRotationMatrix(const G4Point3D axis, const float radians) 1863 { 1864 float res[4]; 1865 // From <http://www.automation.hut.fi/~jaro/thesis/hyper/node9.html>. 1866 1867 res[3] = (float)cos(radians/2); 1868 1869 const float sineval = (float)sin(radians/2); 1870 SbVec3f a = axis; 1871 // we test for a null vector above 1872 (void) a.normalize(); 1873 res[0] = a[0] * sineval; 1874 res[1] = a[1] * sineval; 1875 res[2] = a[2] * sineval; 1876 1877 } 1878 */ 1696 1879 1697 1880 1698 /** This is the benning of a rescale function. It does nothing for the moment
Note: See TracChangeset
for help on using the changeset viewer.