// // The Graphics Callback runs in the application "client thread" (qhStart) and sets the transformations // for the Red Sphere and Green Line of the Cursor. Also, this callback sets the WorldToDevice matrix // for use in the ServoLoopCallback. // void GraphicsCallback(void) { QHGLUT* localDisplayObject = QHGLUT::searchWindow("Coulomb Field Demo");//Get a Pointer to the display object Cursor* localDeviceCursor = Cursor::searchCursor("devCursor");//Get a pointer to the cursor Cylinder* localForceArrow = Cylinder::searchCylinder("forceArrow");//get a pointer to the cylinder Cone* localForceArrowTip = Cone::searchCone("forceArrowTip");//get a pointer to the cylinder Sphere* localCursorSphere = Sphere::searchSphere("cursorSphere");//get a pointer top the Sphere if( localDisplayObject == NULL || localDeviceCursor == NULL || localForceArrow == NULL || localCursorSphere == NULL) return; hduMatrix CylinderTransform;//Transformation for the Cylinder. This transform makes it point toward the Model hduVector3Dd localCursorPosition; hduVector3Dd DirectionVecX; hduVector3Dd PointOnPlane; hduVector3Dd DirectionVecY; hduVector3Dd DirectionVecZ; //Compute the world to device transform WorldToDevice = localDisplayObject->getWorldToDeviceTransform(); // Set transform for Red Sphere localCursorPosition = localDeviceCursor->getPosition();//Get the local cursor position in World Space hduVector3Dd localCursorSpherePos = localCursorSphere->getTranslation(); localCursorSphere->setTranslation(-localCursorSpherePos); localCursorSphere->setTranslation(localCursorPosition);//Set the position of the Sphere the same as the cursor //////////////////////////////////////////////////////////////////////////////////////////// //Code to calculate the transform of the green cylinder to point along the force direction //////////////////////////////////////////////////////////////////////////////////////////// hduMatrix DeviceToWorld = WorldToDevice.getInverse(); HDdouble ForceMagnitude = forceVec.magnitude(); DeviceToWorld[3][0] = 0.0; DeviceToWorld[3][1] = 0.0; DeviceToWorld[3][2] = 0.0; DirectionVecX = forceVec * DeviceToWorld; DirectionVecX.normalize(); PointOnPlane.set(0.0,0.0,(DirectionVecX[0]*localCursorPosition[0] + DirectionVecX[1]*localCursorPosition[1] + DirectionVecX[2]*localCursorPosition[2])/DirectionVecX[2]); DirectionVecY = PointOnPlane - localCursorPosition; DirectionVecY.normalize(); DirectionVecZ = -DirectionVecY.crossProduct(DirectionVecX); CylinderTransform[0][0] = DirectionVecZ[0]; CylinderTransform[0][1] = DirectionVecZ[1]; CylinderTransform[0][2] = DirectionVecZ[2]; CylinderTransform[0][3] = 0.0; CylinderTransform[1][0] = DirectionVecX[0]; CylinderTransform[1][1] = DirectionVecX[1]; CylinderTransform[1][2] = DirectionVecX[2]; CylinderTransform[1][3] = 0.0; CylinderTransform[2][0] = DirectionVecY[0]; CylinderTransform[2][1] = DirectionVecY[1]; CylinderTransform[2][2] = DirectionVecY[2]; CylinderTransform[2][3] = 0.0; CylinderTransform[3][0] = 0.0 ; CylinderTransform[3][1] = 0.0 ; CylinderTransform[3][2] = 0.0 ; CylinderTransform[3][3] = 1.0; CylinderTransform = CylinderTransform * hduMatrix::createTranslation(localCursorPosition[0], localCursorPosition[1], localCursorPosition[2]); localForceArrow->update(chargeRadius/4, ForceMagnitude*50, 15); localForceArrow->setTranslation(localCursorPosition); localForceArrow->setTransform(CylinderTransform); hduMatrix ConeTransform = CylinderTransform * hduMatrix::createTranslation(DirectionVecX[0] * ForceMagnitude*50,DirectionVecX[1] * ForceMagnitude*50,DirectionVecX[2] * ForceMagnitude*50 ); localForceArrowTip->setTransform(ConeTransform); ///////////////////////////////////////////// }
void Parser::parseCylinder(Scene* scene, TransformNode* transform, const Material& mat) { Cylinder* cylinder = 0; Material* newMat = 0; _tokenizer.Read( CYLINDER ); _tokenizer.Read( LBRACE ); for( ;; ) { const Token* t = _tokenizer.Peek(); switch( t->kind() ) { case MATERIAL: delete newMat; newMat = parseMaterialExpression( scene, mat ); break; case NAME: parseIdentExpression(); break; case RBRACE: _tokenizer.Read( RBRACE ); cylinder = new Cylinder(scene, newMat ? newMat : new Material(mat)); cylinder->setTransform( transform ); scene->add( cylinder ); return; default: throw SyntaxErrorException( "Expected: cylinder attributes", _tokenizer ); } } }