本文整理汇总了C++中Matrix3类的典型用法代码示例。如果您正苦于以下问题:C++ Matrix3类的具体用法?C++ Matrix3怎么用?C++ Matrix3使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Matrix3类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SetAttribute
bool XMLElement::SetMatrix3(const String& name, const Matrix3& value)
{
return SetAttribute(name, value.ToString());
}
示例2: proc
int ScubaObjCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat ) {
if ( ! vpt || ! vpt->IsAlive() )
{
// why are we here
DbgAssert(!_T("Invalid viewport!"));
return FALSE;
}
#ifdef _3D_CREATE
DWORD snapdim = SNAP_IN_3D;
#else
DWORD snapdim = SNAP_IN_PLANE;
#endif
#ifdef _OSNAP
if (msg == MOUSE_FREEMOVE)
{
vpt->SnapPreview(m,m,NULL, snapdim);
}
#endif
if (msg==MOUSE_POINT||msg==MOUSE_MOVE) {
switch(point) {
case 0:
ob->suspendSnap = TRUE;
sp0 = m;
p[0] = vpt->SnapPoint(m,m,NULL,snapdim);
mat.SetTrans(p[0]); // Set Node's transform
ob->pblock->SetValue(PB_RADIUS,0,0.01f);
ob->pblock->SetValue(PB_HEIGHT,0,0.01f);
ob->increate=TRUE;
break;
case 1:
mat.IdentityMatrix();
//mat.PreRotateZ(HALFPI);
sp1 = m;
p[1] = vpt->SnapPoint(m,m,NULL,snapdim);
if (ob->dlgCreateMeth) {
// radius
r = Length(p[1]-p[0]);
mat.SetTrans(p[0]);
} else {
// diameter
Point3 center = (p[0]+p[1])/float(2);
r = Length(center-p[0]);
mat.SetTrans(center); // Modify Node's transform
}
ob->pblock->SetValue(PB_RADIUS,0,r);
ob->pblock->SetValue(PB_HEIGHT,0,2.0f*r);
ob->pmapParam->Invalidate();
if (flags&MOUSE_CTRL) {
float ang = (float)atan2(p[1].y-p[0].y,p[1].x-p[0].x);
mat.PreRotateZ(ob->ip->SnapAngle(ang));
}
if (msg==MOUSE_POINT) {
if (Length(m-sp0)<3 ||
Length(p[1]-p[0])<0.1f) {
ob->increate=FALSE;
return CREATE_ABORT;
} h=2.0f*r;
}
break;
case 2:
{
#ifdef _OSNAP
float h1 = vpt->SnapLength(vpt->GetCPDisp(p[1],Point3(0,0,1),sp1,m,TRUE));
#else
float h1 = vpt->SnapLength(vpt->GetCPDisp(p[1],Point3(0,0,1),sp1,m));
#endif
float hmin=2.0f*r;
h1+=(h1<0.0f?-hmin:hmin);
ob->pblock->SetValue(PB_HEIGHT,0,h1);
ob->pmapParam->Invalidate();
if (msg==MOUSE_POINT) {
ob->suspendSnap = FALSE;
ob->increate=FALSE;
return (Length(m-sp0)<3)?CREATE_ABORT:CREATE_STOP;
}
}
break;
}
}
else
if (msg == MOUSE_ABORT) {
ob->increate=FALSE;
return CREATE_ABORT;
}
return TRUE;
}
示例3: AddBone
/*
====================
Save
====================
*/
int G3DSExport::Save(const Str& path)
{
//////////////////////////////////////////////////////////////////////////
// merge the skin
//////////////////////////////////////////////////////////////////////////
struct PRIMITIVE
{
Str name;
Str texture;
std::vector<INode*>bones;
std::vector<Matrix3>transforms;
std::vector<VPTNIW>vertexes;
std::vector<unsigned int>indexes;
Box3 box;
int AddBone(const INode* node, const Matrix3& mat)
{
std::vector<INode*>::iterator it = std::find(bones.begin(), bones.end(), node);
if(it==bones.end()) { bones.push_back((INode*)node); transforms.push_back(mat); return bones.size()-1; }
return it - bones.begin();
}
};
// get all of the textures
std::vector<Str>textures;
for(std::vector<SKIN>::iterator it = mSkins.begin(); it != mSkins.end(); ++it)
{
if(std::find(textures.begin(),textures.end(),it->texture) == textures.end())
{
textures.push_back(it->texture);
}
}
// merge all of the skin to the primitive by the textures
std::vector<PRIMITIVE>primitives;
for(int i = 0; i < textures.size(); i++)
{
PRIMITIVE primitive;
primitive.texture = textures[i];
for(int j = 0; j < mSkins.size(); j++)
{
SKIN& skin = mSkins[j];
if(skin.texture != primitive.texture) continue;
if(primitive.name.size() == 0) primitive.name = skin.name;
// get the start vertex
int start_vertex = primitive.vertexes.size();
// set all of the vertexes
for(int k = 0; k < skin.vertexes.size(); k++ )
{
VPTNIS& v1 = skin.vertexes[k];
VPTNIW v2;
v2.position[0] = v1.pos.x;
v2.position[1] = v1.pos.y;
v2.position[2] = v1.pos.z;
v2.texcoord[0] = v1.uv.x;
v2.texcoord[1] = v1.uv.y;
v2.normal[0] = v1.normal.x;
v2.normal[1] = v1.normal.y;
v2.normal[2] = v1.normal.z;
v2.index[0] = primitive.AddBone(skin.bones[skin.weights[v1.index].index[2]], skin.transforms[skin.weights[v1.index].index[2]]);
v2.index[1] = primitive.AddBone(skin.bones[skin.weights[v1.index].index[1]], skin.transforms[skin.weights[v1.index].index[1]]);
v2.index[2] = primitive.AddBone(skin.bones[skin.weights[v1.index].index[0]], skin.transforms[skin.weights[v1.index].index[0]]);
v2.weight[0] = skin.weights[v1.index].weight[2];
v2.weight[1] = skin.weights[v1.index].weight[1];
v2.weight[2] = skin.weights[v1.index].weight[0];
primitive.vertexes.push_back(v2);
}
// set the index
for(int k = 0; k < skin.triangles.size(); k++)
{
TRIANGLE& tri = skin.triangles[k];
primitive.indexes.push_back(start_vertex + tri.index1[0]);
primitive.indexes.push_back(start_vertex + tri.index1[1]);
primitive.indexes.push_back(start_vertex + tri.index1[2]);
}
// set the box
primitive.box += skin.box;
}
// there is a 75 bone limit for each skinned object.
if(primitive.bones.size()>75) { G3DAssert("There are more %d bones in the primitive and the texture is %s.",primitive.bones.size(), textures[i].c_str()); return 1; }
// add the primitive to the table
primitives.push_back(primitive);
}
//////////////////////////////////////////////////////////////////////////
// save the skin
//////////////////////////////////////////////////////////////////////////
// open the skin file to save it
//.........这里部分代码省略.........
示例4: GetWSMObject
void BombMod::ModifyObject(
TimeValue t, ModContext &mc, ObjectState *os, INode *node)
{
BombObject *bobj = GetWSMObject(t);
if (bobj && nodeRef && (bobj->ClassID() == Class_ID(BOMB_OBJECT_CLASS_ID,0))) {
assert(os->obj->IsSubClassOf(triObjectClassID));
TriObject *triOb = (TriObject *)os->obj;
Interval valid = FOREVER;
if (os->GetTM()) {
Matrix3 tm = *(os->GetTM());
for (int i=0; i<triOb->GetMesh().getNumVerts(); i++) {
triOb->GetMesh().verts[i] = triOb->GetMesh().verts[i] * tm;
}
os->obj->UpdateValidity(GEOM_CHAN_NUM,os->tmValid());
os->SetTM(NULL,FOREVER);
}
if (waitPostLoad) {
valid.SetInstant(t);
triOb->UpdateValidity(GEOM_CHAN_NUM,valid);
triOb->UpdateValidity(TOPO_CHAN_NUM,valid);
return;
}
Matrix3 tm;
TimeValue det = bobj->GetDetonation(t,valid);
float strength = bobj->GetStrength(t,valid) * STRENGTH_CONSTANT;
float grav = bobj->GetGravity(t,valid);
float chaos = bobj->GetChaos(t,valid);
float chaosBase = (float(1)-chaos/2);
float rotSpeed = bobj->GetSpin(t,valid) * TWOPI/float(TIME_TICKSPERSEC);
int minClust = bobj->GetMinFrag(t,valid), maxClust = bobj->GetMaxFrag(t,valid);
if (minClust<1) minClust = 1;
if (maxClust<1) maxClust = 1;
int clustVar = maxClust-minClust+1;
float falloff = bobj->GetFalloff(t,valid);
int useFalloff = bobj->GetFalloffOn(t,valid);
int seed = bobj->GetSeed(t,valid);
//tm = nodeRef->GetNodeTM(t,&valid);
tm = nodeRef->GetObjectTM(t,&valid);
if (t<det) {
valid.Set(TIME_NegInfinity,det-1);
triOb->UpdateValidity(GEOM_CHAN_NUM,valid);
triOb->UpdateValidity(TOPO_CHAN_NUM,valid);
triOb->PointsWereChanged();
return;
}
float dt = float(t-det);
valid.SetInstant(t);
int n0=0,n1=1,n2=2,nv;
Point3 v, p0, p1, g(0.0f,0.0f,grav*GRAVITY_CONSTANT);
Tab<Point3> l_newVerts ;
Face *f = triOb->GetMesh().faces;
float dot;
Mesh &mesh = triOb->GetMesh();
// First, segment the faces.
srand((unsigned int)seed);
Tab<DWORD> vclust;
Tab<DWORD> vmap;
Tab<Point3> nverts;
vclust.SetCount(mesh.getNumVerts());
vmap.SetCount(mesh.getNumVerts());
int numClust = 0;
if (minClust==1 && maxClust==1) {
// Simple case... 1 face per cluster
nv = triOb->GetMesh().getNumFaces() * 3;
l_newVerts.SetCount(nv);
vclust.SetCount(nv);
for (int i=0; i<nv; i++) {
vclust[i] = i/3;
}
for (int i=0,j=0; i<mesh.getNumFaces(); i++) {
l_newVerts[j] = mesh.verts[mesh.faces[i].v[0]];
l_newVerts[j+1] = mesh.verts[mesh.faces[i].v[1]];
l_newVerts[j+2] = mesh.verts[mesh.faces[i].v[2]];
mesh.faces[i].v[0] = j;
mesh.faces[i].v[1] = j+1;
mesh.faces[i].v[2] = j+2;
j += 3;
}
numClust = triOb->GetMesh().getNumFaces();
} else {
// More complex case... clusters are randomely sized
for (int i=0; i<mesh.getNumVerts(); i++) {
vclust[i] = UNDEFINED;
vmap[i] = i;
}
int cnum = 0;
for (int i=0; i<mesh.getNumFaces(); ) {
int csize = int(Rand1()*float(clustVar)+float(minClust));
//.........这里部分代码省略.........
示例5: CopyMatrixToArray
void CopyMatrixToArray ( Matrix3& myMatrix, GLfloat a[9] )
{
for(int i=0;i<9;++i)
a[i] = myMatrix.getData(i);
}
示例6: right_cauchy_green_deformation_tensor
inline void right_cauchy_green_deformation_tensor(
const Matrix3<T>& F, Matrix3<T>& C)
{
C = F.transpose() * F;
}
示例7: Mesh
Mesh*
TriObject::GetRenderMesh(TimeValue t, INode *inode, View &view, BOOL& needDelete)
{
if (mDisableDisplacement || !(view.flags & RENDER_MESH_DISPLACEMENT_MAP)) {
needDelete = FALSE;
return &mesh;
}
// need to check the mesh and see if any face has a matId the requires displacment mapping
BOOL needDisp = FALSE;
// Get the material
Mtl* pMtl = inode ? inode->GetMtl() : NULL;
if (pMtl) {
// does the mesh as a whole need it
if (pMtl->Requirements(mesh.mtlIndex)&MTLREQ_DISPLACEMAP)
needDisp = TRUE;
if (!needDisp) {
for (int f = 0; f < mesh.numFaces; f++) {
if (pMtl->Requirements(mesh.getFaceMtlIndex(f))&MTLREQ_DISPLACEMAP) {
needDisp = TRUE;
break;
}
}
}
if (needDisp) {
if (mesh.getNumFaces() == 0)
return &mesh;
Matrix3 otm;
if (inode)
otm = inode->GetObjectTM(t);
else
otm.IdentityMatrix();
GetGTessFunction();
if (mSubDivideDisplacement && psGTessFunc) {
// if we have a material that does displacement mapping and if we can do it
Mesh *pMesh = new Mesh();
needDelete = TRUE;
(*psGTessFunc)((void *)&mesh, MAX_MESH, &otm, pMesh, NULL,
&mDispApprox, &view, pMtl, FALSE, mSplitMesh);
needDelete = TRUE;
return pMesh;
} else {
Mesh *pMesh = new Mesh(mesh);
needDelete = TRUE;
BOOL hasUVs = pMesh->tvFace != NULL;
pMesh->buildRenderNormals();
// now displace the verts
BitArray vertsSet;
vertsSet.SetSize(pMesh->numVerts);
for (int f = 0; f < pMesh->numFaces; f++) {
Face *pFace = &pMesh->faces[f];
TVFace *pTVFace = &pMesh->tvFace[f];
int matid = pFace->getMatID();
for (int v = 0; v < 3; v++) {
int vidx = pFace->v[v];
if (vertsSet[vidx])
continue; // displace only once
Point3 norm = pMesh->getNormal(vidx);
norm.Normalize();
Point3& vert = pMesh->getVert(vidx);
UVVert uvvert;
if (hasUVs)
uvvert = pMesh->getTVert(pTVFace->t[v]);
else {
uvvert.x = 0.0;
uvvert.y = 0.0;
}
pMesh->buildBoundingBox();
Box3 bbox = pMesh->getBoundingBox();
float dispScale = Length(bbox.pmax - bbox.pmin)/10.0f;
float disp = GetDisp(pMtl, pMesh, f, pFace->getMatID(), vert, uvvert.x, uvvert.y, otm) * dispScale;
vert += (norm * disp);
vertsSet.Set(vidx);
}
}
return pMesh;
}
}
}
needDelete = FALSE;
return &mesh;
}
示例8: evaluate_reverse
ErrorCode EvalSet::evaluate_reverse(EvalFcn eval, JacobianFcn jacob, InsideFcn inside_f,
const double *posn, const double *verts, const int nverts,
const int ndim, const double iter_tol, const double inside_tol,
double *work, double *params, int *inside) {
// TODO: should differentiate between epsilons used for
// Newton Raphson iteration, and epsilons used for curved boundary geometry errors
// right now, fix the tolerance used for NR
const double error_tol_sqr = iter_tol*iter_tol;
CartVect *cvparams = reinterpret_cast<CartVect*>(params);
const CartVect *cvposn = reinterpret_cast<const CartVect*>(posn);
// initialize to center of element
*cvparams = CartVect(-.4);
CartVect new_pos;
// evaluate that first guess to get a new position
ErrorCode rval = (*eval)(cvparams->array(), verts, ndim,
3, // hardwire to num_tuples to 3 since the field is coords
work, new_pos.array());
if (MB_SUCCESS != rval) return rval;
// residual is diff between old and new pos; need to minimize that
CartVect res = new_pos - *cvposn;
Matrix3 J;
int dum, *tmp_inside = (inside ? inside : &dum);
int iters=0;
// while |res| larger than tol
while (res % res > error_tol_sqr) {
if(++iters>10) {
// if we haven't converged but we're outside, that's defined as success
*tmp_inside = (*inside_f)(params, ndim, inside_tol);
if (!(*tmp_inside)) return MB_SUCCESS;
else return MB_FAILURE;
}
// get jacobian at current params
rval = (*jacob)(cvparams->array(), verts, nverts, ndim, work, J[0]);
double det = J.determinant();
if (det < std::numeric_limits<double>::epsilon()) {
*tmp_inside = (*inside_f)(params, ndim, inside_tol);
if (!(*tmp_inside)) return MB_SUCCESS;
else return MB_INDEX_OUT_OF_RANGE;
}
// new params tries to eliminate residual
*cvparams -= J.inverse(1.0/det) * res;
// get the new forward-evaluated position, and its difference from the target pt
rval = (*eval)(params, verts, ndim,
3, // hardwire to num_tuples to 3 since the field is coords
work, new_pos.array());
if (MB_SUCCESS != rval) return rval;
res = new_pos - *cvposn;
}
if (inside)
*inside = (*inside_f)(params, ndim, inside_tol);
return MB_SUCCESS;
}// Map::evaluate_reverse()
示例9: GetParticleChannelNewRInterface
bool PFOperatorSimpleSpeed::Proceed(IObject* pCont,
PreciseTimeValue timeStart,
PreciseTimeValue& timeEnd,
Object* pSystem,
INode* pNode,
INode* actionNode,
IPFIntegrator* integrator)
{
// acquire all necessary channels, create additional if needed
IParticleChannelNewR* chNew = GetParticleChannelNewRInterface(pCont);
if(chNew == NULL) return false;
IParticleChannelPTVR* chTime = GetParticleChannelTimeRInterface(pCont);
if(chTime == NULL) return false;
IParticleChannelAmountR* chAmount = GetParticleChannelAmountRInterface(pCont);
if(chAmount == NULL) return false;
// the position channel may not be present. For some option configurations it is okay
IParticleChannelPoint3R* chPos = GetParticleChannelPositionRInterface(pCont);
int iDir = _pblock()->GetInt(kSimpleSpeed_direction, timeStart);
if ((chPos == NULL) && ((iDir == kSS_Icon_Center_Out) || (iDir == kSS_Icon_Arrow_Out)))
return false;
IChannelContainer* chCont;
chCont = GetChannelContainerInterface(pCont);
if (chCont == NULL) return false;
// the channel of interest
bool initSpeed = false;
IParticleChannelPoint3W* chSpeed = (IParticleChannelPoint3W*)chCont->EnsureInterface(PARTICLECHANNELSPEEDW_INTERFACE,
ParticleChannelPoint3_Class_ID,
true, PARTICLECHANNELSPEEDR_INTERFACE,
PARTICLECHANNELSPEEDW_INTERFACE, true,
actionNode, (Object*)NULL, &initSpeed);
IParticleChannelPoint3R* chSpeedR = GetParticleChannelSpeedRInterface(pCont);
if ((chSpeed == NULL) || (chSpeedR == NULL)) return false;
// there are no new particles
if (chNew->IsAllOld()) return true;
float fUPFScale = 1.0f/TIME_TICKSPERSEC; // conversion units per seconds to units per tick
Point3 pt3SpeedVec;
RandGenerator* prg = randLinker().GetRandGenerator(pCont);
int iQuant = chAmount->Count();
bool wasIgnoringEmitterTMChange = IsIgnoringEmitterTMChange();
if (!wasIgnoringEmitterTMChange) SetIgnoreEmitterTMChange();
for(int i = 0; i < iQuant; i++) {
if(chNew->IsNew(i)) { // apply only to new particles
TimeValue tv = chTime->GetValue(i).TimeValue();
Matrix3 nodeTM = pNode->GetObjectTM(tv);
float fSpeedParam = fUPFScale * GetPFFloat(pblock(), kSimpleSpeed_speed, tv);
// change speed in user selected direction
switch(iDir) {
case kSS_Along_Icon_Arrow: {
// icon arrow appears to be in the negative z direction
pt3SpeedVec = -Normalize(nodeTM.GetRow(2));
}
break;
case kSS_Icon_Center_Out: {
Point3 pt3IconCenter = nodeTM.GetTrans();
Point3 pt3PartPos = chPos->GetValue(i);
pt3SpeedVec = Normalize(pt3PartPos - pt3IconCenter);
}
break;
case kSS_Icon_Arrow_Out: {
Point3 pt3PartPos = chPos->GetValue(i);
Point3 pt3ArrowVec = nodeTM.GetRow(2);
Point3 pt3Tmp = CrossProd(pt3PartPos - nodeTM.GetTrans(), pt3ArrowVec);
pt3SpeedVec = Normalize(CrossProd(pt3ArrowVec, pt3Tmp));
}
break;
case kSS_Rand_3D: {
pt3SpeedVec = RandSphereSurface(prg);
}
break;
case kSS_Rand_Horiz: {
float fAng = TWOPI * prg->Rand01();
// establish x, y coordinates of random angle, z component zero
float x = cos(fAng); float y = sin(fAng); float z = 0.0f;
pt3SpeedVec = Point3(x, y, z);
}
break;
case kSS_Inherit_Prev: {
if (initSpeed)
pt3SpeedVec = Point3::Origin;
else
pt3SpeedVec = Normalize(chSpeedR->GetValue(i));
}
break;
}
// account for reverse check box
int iRev = _pblock()->GetInt(kSimpleSpeed_reverse, 0);
float fDirMult = iRev > 0 ? -1.f : 1.f;
// calculate variation
float fVar = fUPFScale * GetPFFloat(pblock(), kSimpleSpeed_variation, tv);
if(fVar > 0.f)
fSpeedParam = fSpeedParam + fVar * prg->Rand11();
pt3SpeedVec = fDirMult * fSpeedParam * pt3SpeedVec;
// calculate divergence
float fDiv = GetPFFloat(pblock(), kSimpleSpeed_divergence, tv);
pt3SpeedVec = DivergeVectorRandom(pt3SpeedVec, prg, fDiv);
//.........这里部分代码省略.........
示例10: GetTimeValueFromFrame
bool AlembicCamera::Save(double time, bool bLastFrame)
{
TimeValue ticks = GetTimeValueFromFrame(time);
Object *obj = mMaxNode->EvalWorldState(ticks).obj;
if (mNumSamples == 0) {
bForever = CheckIfObjIsValidForever(obj, ticks);
}
else {
bool bNewForever = CheckIfObjIsValidForever(obj, ticks);
if (bForever && bNewForever != bForever) {
ESS_LOG_INFO("bForever has changed");
}
}
bForever = false;
SaveMetaData(mMaxNode, this);
// Set the xform sample
Matrix3 wm = mMaxNode->GetObjTMAfterWSM(ticks);
if (mJob) {
Point3 worldMaxPoint = wm.GetTrans();
Abc::V3f alembicWorldPoint = ConvertMaxPointToAlembicPoint(worldMaxPoint);
mJob->GetArchiveBBox().extendBy(alembicWorldPoint);
}
// check if the camera is animated
if (mNumSamples > 0) {
if (bForever) {
return true;
}
}
// Return a pointer to a Camera given an INode or return false if the node
// cannot be converted to a Camera
CameraObject *cam = NULL;
if (obj->CanConvertToType(Class_ID(SIMPLE_CAM_CLASS_ID, 0))) {
cam = reinterpret_cast<CameraObject *>(
obj->ConvertToType(ticks, Class_ID(SIMPLE_CAM_CLASS_ID, 0)));
}
else if (obj->CanConvertToType(Class_ID(LOOKAT_CAM_CLASS_ID, 0))) {
cam = reinterpret_cast<CameraObject *>(
obj->ConvertToType(ticks, Class_ID(LOOKAT_CAM_CLASS_ID, 0)));
}
else {
return false;
}
CameraState cs;
Interval valid = FOREVER;
cam->EvalCameraState(ticks, valid, &cs);
float tDist = cam->GetTDist(ticks);
float ratio = GetCOREInterface()->GetRendImageAspect();
float aperatureWidth =
GetCOREInterface()->GetRendApertureWidth(); // this may differ from the
// imported value
// unfortunately
float focalLength =
(float)((aperatureWidth / 2.0) /
tan(cs.fov / 2.0)); // alembic wants this one in millimeters
aperatureWidth /= 10.0f; // convert to centimeters
IMultiPassCameraEffect *pCameraEffect = cam->GetIMultiPassCameraEffect();
Interval interval = FOREVER;
BOOL bUseTargetDistance = FALSE;
const int TARGET_DISTANCE = 0;
pCameraEffect->GetParamBlockByID(0)->GetValue(TARGET_DISTANCE, ticks,
bUseTargetDistance, interval);
float fFocalDepth = 0.0f;
const int FOCAL_DEPTH = 1;
pCameraEffect->GetParamBlockByID(0)->GetValue(FOCAL_DEPTH, ticks, fFocalDepth,
interval);
// store the camera data
mCameraSample.setNearClippingPlane(cs.hither);
mCameraSample.setFarClippingPlane(cs.yon);
// mCameraSample.setLensSqueezeRatio(ratio);
// should set to 1.0 according the article "Maya to Softimage: Camera
// Interoperability"
mCameraSample.setLensSqueezeRatio(1.0);
mCameraSample.setFocalLength(focalLength);
mCameraSample.setHorizontalAperture(aperatureWidth);
mCameraSample.setVerticalAperture(aperatureWidth / ratio);
if (bUseTargetDistance) {
mCameraSample.setFocusDistance(tDist);
}
else {
mCameraSample.setFocusDistance(fFocalDepth);
}
// save the samples
mCameraSchema.set(mCameraSample);
mNumSamples++;
//.........这里部分代码省略.........
示例11: perfMatrix3
void perfMatrix3() {
printf("Matrix3:\n");
uint64 raw, opt, overhead, naive;
// 0.5 million operations
int n = 1024 * 1024 / 2;
// Use two copies to avoid nice cache behavior
Matrix3 A = Matrix3::fromAxisAngle(Vector3(1, 2, 1), 1.2f);
Matrix3 B = Matrix3::fromAxisAngle(Vector3(0, 1, -1), .2f);
Matrix3 C = Matrix3::zero();
Matrix3 D = Matrix3::fromAxisAngle(Vector3(1, 2, 1), 1.2f);
Matrix3 E = Matrix3::fromAxisAngle(Vector3(0, 1, -1), .2f);
Matrix3 F = Matrix3::zero();
int i;
System::beginCycleCount(overhead);
for (i = n - 1; i >= 0; --i) {
}
System::endCycleCount(overhead);
System::beginCycleCount(raw);
for (i = n - 1; i >= 0; --i) {
C = A.transpose();
F = D.transpose();
C = B.transpose();
}
System::endCycleCount(raw);
System::beginCycleCount(opt);
for (i = n - 1; i >= 0; --i) {
Matrix3::transpose(A, C);
Matrix3::transpose(D, F);
Matrix3::transpose(B, C);
}
System::endCycleCount(opt);
raw -= overhead;
opt -= overhead;
printf(" Transpose Performance outcome\n");
printf(" transpose(A, C): %g cycles/mul %s\n\n",
(double)opt / (3*n), (opt/(3*n) < 400) ? " ok " : "FAIL");
printf(" C = A.transpose(): %g cycles/mul %s\n",
(double)raw / (3*n), (raw/(3*n) < 150) ? " ok " : "FAIL");
printf("\n");
/////////////////////////////////
printf(" Matrix-Matrix Multiplication\n");
System::beginCycleCount(raw);
for (i = n - 1; i >= 0; --i) {
C = A * B;
F = D * E;
C = A * D;
}
System::endCycleCount(raw);
System::beginCycleCount(opt);
for (i = n - 1; i >= 0; --i) {
Matrix3::mul(A, B, C);
Matrix3::mul(D, E, F);
Matrix3::mul(A, D, C);
}
System::endCycleCount(opt);
{
float A[3][3], B[3][3], C[3][3], D[3][3], E[3][3], F[3][3];
System::beginCycleCount(naive);
for (i = n - 1; i >= 0; --i) {
mul(A, B, C);
mul(D, E, F);
mul(A, D, C);
}
System::endCycleCount(naive);
}
raw -= overhead;
opt -= overhead;
printf(" mul(A, B, C) %g cycles/mul %s\n", (double)opt / (3*n), (opt/(3*n) < 250) ? " ok " : "FAIL");
printf(" C = A * B %g cycles/mul %s\n", (double)raw / (3*n), (raw/(3*n) < 500) ? " ok " : "FAIL");
printf(" naive for-loops %g cycles/mul\n", (double)naive / (3*n));
printf("\n\n");
}
示例12: TMNegParity
// Determine is the node has negative scaling.
// This is used for mirrored objects for example. They have a negative scale factor
// so when calculating the normal we should take the vertices counter clockwise.
// If we don't compensate for this the objects will be 'inverted'.
BOOL ElMaxPlugin::TMNegParity(Matrix3 &m)
{
return (DotProd(CrossProd(m.GetRow(0), m.GetRow(1)), m.GetRow(2)) < 0.0f) ? 1 : 0;
}
示例13: StartProgressInfo
void SGP_MaxInterface::GetTracks( int nNodeCount, INode** nodes, Track** tracks )
{
StartProgressInfo(_M("Get node track..."));
TimeValue nStartTick = GetStartTick();
TimeValue nEndTick = GetEndTick();
int nTickPerFrame = GetTickPerFrame();
int nFrameCount = 0;
for( TimeValue t = nStartTick; t <= nEndTick; t += nTickPerFrame )
nFrameCount++;
for( int i = 0; i < nNodeCount; i++ )
{
tracks[i]->vectorVisible.resize( nFrameCount );
tracks[i]->vectorTrans.resize( nFrameCount );
tracks[i]->vectorRot.resize( nFrameCount );
tracks[i]->vectorScale.resize( nFrameCount );
Matrix3 matrix = nodes[i]->GetObjTMAfterWSM ( 0 );
bool bMirror = DotProd ( CrossProd ( matrix.GetRow ( 0 ), matrix.GetRow ( 1 ) ), matrix.GetRow ( 2 ) ) < 0.0 ? true : false;
tracks[i]->bMirror = bMirror;
}
TimeValue t = nStartTick;
for( int nFrameId = 0; nFrameId < nFrameCount; nFrameId++, t += nTickPerFrame )
{
SetProgressInfo( 100.0f*nFrameId/nFrameCount );
for( int nNodeId = 0; nNodeId < nNodeCount; nNodeId++ )
{
INode* pNode = nodes[nNodeId];
Track* pTrack = tracks[nNodeId];
Matrix3 tm = pNode->GetNodeTM(t);
// The coordinate system of 3DMax9 is Right-X Up-Z Screenin-Y
// But coordinate system of SGP Engine is like D3D Right-X Up-Y Screenin-Z
// Node Transform Matrix should be swaped.
/*
If your matrix looks like this:
{ rx, ry, rz, 0 }
{ ux, uy, uz, 0 }
{ lx, ly, lz, 0 }
{ px, py, pz, 1 }
To change it from left to right or right to left, flip it like this:
{ rx, rz, ry, 0 }
{ lx, lz, ly, 0 }
{ ux, uz, uy, 0 }
{ px, pz, py, 1 }
*/
Point3 Row0 = tm.GetRow(0);
Point3 Row1 = tm.GetRow(1);
Point3 Row2 = tm.GetRow(2);
Point3 Row3 = tm.GetRow(3);
sgp::swapVariables( Row0.y, Row0.z );
sgp::swapVariables( Row1.x, Row2.x );
sgp::swapVariables( Row1.y, Row2.z );
sgp::swapVariables( Row1.z, Row2.y );
sgp::swapVariables( Row3.y, Row3.z );
tm.SetRow(0, Row0);
tm.SetRow(1, Row1);
tm.SetRow(2, Row2);
tm.SetRow(3, Row3);
Point3 trans;
Quat quat;
Point3 scale;
{
// calculate the translation component
Point3 p;
p = tm.GetTrans();
trans.x = p.x;
trans.y = p.y;
trans.z = p.z;
scale.x = tm.GetRow(0).Length();
scale.y = tm.GetRow(1).Length();
scale.z = tm.GetRow(2).Length();
tm.NoScale();
// calculate the rotation component
Quat q(tm);
if( tracks[nNodeId]->bMirror )
{
float m[4][3];
memcpy( m, &tm, sizeof(float)*4*3 );
m[0][0] *= -1;
m[1][0] *= -1;
m[2][0] *= -1;
Matrix3 mm(m);
Quat q0(mm);
q = q0;
}
//.........这里部分代码省略.........
示例14: DrawMatrix
void NCLDebug::DrawMatrix(const Matrix3& mtx, const Vector3& position)
{
DrawHairLine(position, position + mtx.GetCol(0), Vector4(1.0f, 0.0f, 0.0f, 1.0f));
DrawHairLine(position, position + mtx.GetCol(1), Vector4(0.0f, 1.0f, 0.0f, 1.0f));
DrawHairLine(position, position + mtx.GetCol(2), Vector4(0.0f, 0.0f, 1.0f, 1.0f));
}
示例15: _duplicate_paste
void GridMapEditor::_duplicate_paste() {
if (!selection.active)
return;
int idx = options->get_popup()->get_item_index(MENU_OPTION_DUPLICATE_SELECTS);
bool reselect = options->get_popup()->is_item_checked( idx );
List< __Item > items;
Matrix3 rot;
rot.set_orthogonal_index(selection.duplicate_rot);
for(int i=selection.begin.x;i<=selection.end.x;i++) {
for(int j=selection.begin.y;j<=selection.end.y;j++) {
for(int k=selection.begin.z;k<=selection.end.z;k++) {
int itm = node->get_cell_item(i,j,k);
if (itm==GridMap::INVALID_CELL_ITEM)
continue;
int orientation = node->get_cell_item_orientation(i,j,k);
__Item item;
Vector3 rel=Vector3(i,j,k)-selection.begin;
rel = rot.xform(rel);
Matrix3 orm;
orm.set_orthogonal_index(orientation);
orm = rot * orm;
item.pos=selection.begin+rel;
item.item=itm;
item.rot=orm.get_orthogonal_index();
items.push_back(item);
}
}
}
Vector3 ofs=selection.current-selection.click;
if (items.size()) {
undo_redo->create_action("GridMap Duplicate Selection");
for(List< __Item >::Element *E=items.front();E;E=E->next()) {
__Item &it=E->get();
Vector3 pos = it.pos+ofs;
undo_redo->add_do_method(node,"set_cell_item",pos.x,pos.y,pos.z,it.item,it.rot);
undo_redo->add_undo_method(node,"set_cell_item",pos.x,pos.y,pos.z,node->get_cell_item(pos.x,pos.y,pos.z),node->get_cell_item_orientation(pos.x,pos.y,pos.z));
}
undo_redo->commit_action();
}
if (reselect) {
selection.begin+=ofs;
selection.end+=ofs;
selection.click=selection.begin;
selection.current=selection.end;
_validate_selection();
}
}