MFloatPointArray ropeGenerator::createHalfRope( int pointsCount, float radius ) { MFloatPointArray points; MPoint baseVector( 1,0,0 ); baseVector = baseVector * radius; points.append( MFloatPoint( baseVector.x, baseVector.y, baseVector.z, 1.0 ) ); float fbaseAngle = 180.0 / float( pointsCount ); for (int d = 1; d < pointsCount; d++) { if (d == 1) { MAngle baseAngle((fbaseAngle * 0.25), MAngle::kDegrees ); MVector vVector( baseVector ); vVector = vVector.rotateBy( MVector::kYaxis, baseAngle.asRadians() ); points.append( MFloatPoint( vVector.x, vVector.y, vVector.z, 1.0 ) ); } MAngle baseAngle((fbaseAngle * float( d ) ), MAngle::kDegrees ); MVector vVector( baseVector ); vVector = vVector.rotateBy( MVector::kYaxis, baseAngle.asRadians() ); points.append( MFloatPoint( vVector.x, vVector.y, vVector.z, 1.0 ) ); if ( d == pointsCount - 1 ) { MAngle baseAngle((fbaseAngle * ( d + 0.75 )), MAngle::kDegrees ); MVector vVector( baseVector ); vVector = vVector.rotateBy( MVector::kYaxis, baseAngle.asRadians() ); points.append( MFloatPoint( vVector.x, vVector.y, vVector.z, 1.0 ) ); } } return points; }
void ropeGenerator::createCriclePoints( int pointsCount, MMatrix bMatrix, MFloatPointArray &points, float radius ) { MPoint baseVector2( radius,0,0 ); baseVector2 = baseVector2 * bMatrix; points.append( MFloatPoint( baseVector2.x, baseVector2.y, baseVector2.z, 1.0 ) ); float baseAngle = 360.0f / float( pointsCount ); for (int d = 1; d < pointsCount; d++ ) { MVector vVector( radius,0,0 ); vVector = vVector.rotateBy( MVector::kYaxis, MAngle( baseAngle * float( d ),MAngle::kDegrees).asRadians() ); MPoint point( vVector.x, vVector.y, vVector.z ); point = point * bMatrix; points.append( MFloatPoint( point.x, point.y, point.z, 1.0 )); } }
sgBLocator_fromGeo::sgBLocator_fromGeo() { m_pointArr.setLength(6); m_pointArr[0] = MFloatPoint( 1, 0, 0 ); m_pointArr[1] = MFloatPoint( -1, 0, 0 ); m_pointArr[2] = MFloatPoint( 0, -1, 0 ); m_pointArr[3] = MFloatPoint( 0, 1, 0 ); m_pointArr[4] = MFloatPoint( 0, 0, 1 ); m_pointArr[5] = MFloatPoint( 0, 0, -1 ); m_boundingBox.clear(); m_boundingBox.expand( MVector( 1.0, 1.0, 1.0 ) ); m_boundingBox.expand( MVector( -1.0, -1.0, -1.0 ) ); m_colorActive = MColor( 1.0f, 1.0f, 1.0f ); m_colorLead = MColor( .26f, 1.0f, .64f ); m_colorDefault = MColor( 1.0f, 1.0f, 0.0f ); m_lineWidth = 1; MFnDependencyNode fnNode( thisMObject() ); MPlug plugOutput = fnNode.findPlug( aOutputValue ); MPlug plugVis =fnNode.findPlug( "v" ); MDGModifier dgModifier; dgModifier.connect( plugOutput, plugVis ); }
void ropeGenerator::createRopesRings( int ropesCount, MMatrix bMatrix, MFloatPointArray &points, int pointsCount, float ropeStrength, float radius ) { MAngle angle( (180.0/ ropesCount ), MAngle::kDegrees ); float distanceToMoveRope = cos( angle.asRadians() ); float singleRopeRadius = sin( angle.asRadians() ); float baseAngle = 360.0f / float( ropesCount ); for ( int d = 1; d < ropesCount + 1; d++) { MFloatPointArray ropePoints( createHalfRope( pointsCount, singleRopeRadius ) ); for ( int ropP = 0; ropP < ropePoints.length(); ropP++) { MFloatPoint ropPoint( ropePoints[ropP] ); MVector ropV( ropPoint.x, ropPoint.y, ropPoint.z * ropeStrength ); ropV = ropV + MVector( 0,0,-distanceToMoveRope ); ropV = ropV.rotateBy( MVector::kYaxis, MAngle( baseAngle * float( d ), MAngle::kDegrees).asRadians() ); MPoint ropFinalPoint( ropV * radius ); ropFinalPoint = ropFinalPoint * bMatrix; points.append( MFloatPoint( ropFinalPoint.x, ropFinalPoint.y, ropFinalPoint.z ) ); } } }
void MayaGeoAttribute::transferValueToMaya(MPlug &plug, MDataBlock &data){ coral::Geo *coralGeo = value(); const std::vector<Imath::V3f> &coralPoints = coralGeo->points(); // transfer points MFloatPointArray mayaPoints; for(int i = 0; i < coralPoints.size(); ++i){ const Imath::V3f *coralPoint = &coralPoints[i]; mayaPoints.append(MFloatPoint(coralPoint->x, coralPoint->y, coralPoint->z)); } // transfer faces MIntArray mayaFaceCount; MIntArray mayaFaceVertices; const std::vector<std::vector<int> > coralFaces = coralGeo->rawFaces(); for(int polyId = 0; polyId < coralFaces.size(); ++polyId){ const std::vector<int> *coralFace = &coralFaces[polyId]; int faceVertexCount = coralFace->size(); mayaFaceCount.append(faceVertexCount); for(int i = 0; i < faceVertexCount; ++i){ mayaFaceVertices.append(coralFace->at(i)); } } // create maya mesh MDataHandle dataHandle = data.outputValue(plug); MFnMeshData dataCreator; MObject newOutputData = dataCreator.create(); MFnMesh newMesh; newMesh.create(mayaPoints.length(), coralFaces.size(), mayaPoints, mayaFaceCount, mayaFaceVertices, newOutputData); dataHandle.set(newOutputData); }
MStatus sgBLocator_fromGeo::compute( const MPlug& plug, MDataBlock& data ) { MStatus status; m_boundingBox.clear(); m_boundingBox.expand( MVector( 1.0, 1.0, 1.0 ) ); m_boundingBox.expand( MVector( -1.0, -1.0, -1.0 ) ); m_pointArr.setLength(6); m_pointArr[0] = MFloatPoint( 1, 0, 0 ); m_pointArr[1] = MFloatPoint( -1, 0, 0 ); m_pointArr[2] = MFloatPoint( 0, -1, 0 ); m_pointArr[3] = MFloatPoint( 0, 1, 0 ); m_pointArr[4] = MFloatPoint( 0, 0, 1 ); m_pointArr[5] = MFloatPoint( 0, 0, -1 ); m_lineWidth = data.inputValue( aLineWidth ).asInt(); data.setClean( plug ); return MS::kSuccess; }
MFloatPoint convert( const Imath::V3d &from ) { return MFloatPoint( from[0], from[1], from[2] ); }