本文整理汇总了C++中Matrix3::PointTransform方法的典型用法代码示例。如果您正苦于以下问题:C++ Matrix3::PointTransform方法的具体用法?C++ Matrix3::PointTransform怎么用?C++ Matrix3::PointTransform使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Matrix3
的用法示例。
在下文中一共展示了Matrix3::PointTransform方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetColMesh
ColMesh* RBExport::GetColMesh( INode* node )
{
ObjectState os = node->EvalWorldState( m_CurTime );
Object* pObject = os.obj;
if (!pObject)
{
Warn( "Could not evaluate object state. Collision mesh %s was skipped.", node->GetName() );
return NULL;
}
Matrix3 nodeTM = node->GetNodeTM( m_CurTime );
Matrix3 nodeTMAfterWSM = node->GetObjTMAfterWSM( m_CurTime );
Matrix3 mOffs = nodeTMAfterWSM*Inverse( nodeTM );
// triangulate
TriObject* pTriObj = NULL;
if (pObject->CanConvertToType( Class_ID( TRIOBJ_CLASS_ID, 0 ) ))
{
pTriObj = (TriObject*)pObject->ConvertToType( m_CurTime, Class_ID( TRIOBJ_CLASS_ID, 0 ) );
}
bool bReleaseTriObj = (pTriObj != pObject);
if (!pTriObj)
{
Warn( "Could not triangulate mesh in node. Collision mesh %s was skipped.", node->GetName() );
return NULL;
}
// ensure, that vertex winding direction in polygon is CCW
Matrix3 objTM = node->GetObjTMAfterWSM( m_CurTime );
bool bNegScale = (DotProd( CrossProd( objTM.GetRow(0), objTM.GetRow(1) ), objTM.GetRow(2) ) >= 0.0);
int vx[3];
vx[0] = bNegScale ? 2 : 0;
vx[1] = bNegScale ? 1 : 1;
vx[2] = bNegScale ? 0 : 2;
Mesh& mesh = pTriObj->GetMesh();
// some cosmetics
mesh.RemoveDegenerateFaces();
mesh.RemoveIllegalFaces();
// create collision mesh
ColMesh* pMesh = new ColMesh();
int numPri = mesh.getNumFaces();
int numVert = mesh.numVerts;
// copy vertices
for (int i = 0; i < numVert; i++)
{
Point3 pt = mesh.verts[i];
pt = mOffs.PointTransform( pt );
pt = c_FlipTM.PointTransform( pt );
pMesh->AddVertex( Vec3( pt.x, pt.y, pt.z ) );
}
// loop on mesh faces
for (int i = 0; i < numPri; i++)
{
Face& face = mesh.faces[i];
pMesh->AddPoly( face.v[vx[0]], face.v[vx[1]], face.v[vx[2]] );
}
Msg( LogType_Stats, "Physics collision trimesh has %d vertices and %d faces.", numVert, numPri );
return pMesh;
} // RBExport::GetColMesh
示例2: Capture
//.........这里部分代码省略.........
if (!bRes) return FALSE;
static int remap[3];
if (U.m_SkinFlipFaces){
remap[0] = 0;
remap[1] = 1;
remap[2] = 2;
}else{
remap[0] = 0;
remap[1] = 2;
remap[2] = 1;
}
// Process mesh
// Get object from node. Abort if no object.
Log("..Transforming mesh");
BOOL bDeleteTriObject;
R_ASSERT (pObject);
TriObject * pTriObject = GetTriObjectFromObjRef(pObject, &bDeleteTriObject);
if (!pTriObject){
ERR("Can't create tri object.");
return FALSE;
}
Mesh& M = pTriObject->mesh;
// Vertices
{
// check match with
int iNumVert = M.getNumVerts();
if (!(iNumVert==numVertices && iNumVert==m_Vertices.size()))
{
ERR("Non attached vertices found.");
if (bDeleteTriObject) delete(pTriObject);
return FALSE;
}
// transform vertices
for (int i=0; i<iNumVert; i++){
Point3 P = M.getVert(i);
Point3 T = matMesh.PointTransform(P);
T *= m_fGlobalScale;
m_Vertices[i]->SetPosition(T);
}
}
Log("..Parsing materials");
// Parse Materials
m_MtlMain = m_MeshNode->GetMtl();
R_ASSERT(m_MtlMain);
DWORD cSubMaterials=m_MtlMain->NumSubMtls();
if (cSubMaterials < 1) {
// Count the material itself as a submaterial.
cSubMaterials = 1;
}
// build normals
M.buildRenderNormals();
Log("..Converting vertices");
// our Faces and Vertices
{
for (int i=0; i<M.getNumFaces(); i++){
Face* gF = M.faces + i;
TVFace* tF = M.tvFace + i;
int m_id = gF->getMatID();
if (cSubMaterials == 1){
m_id = 0;
}else{
// SDK recommends mod'ing the material ID by the valid # of materials,
// as sometimes a material number that's too high is returned.
m_id %= cSubMaterials;
}
st_FACE* nF = xr_new<st_FACE>();
nF->m_id = m_id;
nF->sm_group = gF->getSmGroup();
for (int VVV=0; VVV<3; VVV++){
int vert_id = gF->v[remap[VVV]];
CVertexDef &D = *(m_Vertices[vert_id]);
Point3 &UV = M.tVerts[tF->t[remap[VVV]]];
st_VERT v;
v.Set (D);
v.P.set (D.P);
v.SetUV (UV.x,1-UV.y);
// v.sm_group = U.m_SkinSuppressSmoothGroup?0:gF->getSmGroup(); // smooth group
nF->v[VVV] = AddVert(v);
}
m_ExpFaces.push_back(nF);
}
}
if (bDeleteTriObject) delete(pTriObject);
}
UpdateParenting();
return bRes;
};
示例3: ProcessMesh
//.........这里部分代码省略.........
Spam( "Original mesh has %d vertices and %d faces.", numVert, numPri );
bool bHasVoidFaces = false;
// loop on mesh faces
for (int i = 0; i < numPri; i++)
{
Face& face = mesh.faces[i];
// calculate face normal
const Point3& v0 = mesh.verts[face.v[vx[0]]];
const Point3& v1 = mesh.verts[face.v[vx[1]]];
const Point3& v2 = mesh.verts[face.v[vx[2]]];
Point3 normal = -Normalize( (v1 - v0)^(v2 - v1) );
normal = mOffs.VectorTransform( normal );
normal = c_FlipTM.VectorTransform( normal );
// loop on face vertices
ExpVertex* pFaceVertex[3];
for (int j = 0; j < 3; j++)
{
ExpVertex v;
v.mtlID = pExpNode->GetMaterialIdx( face.getMatID() );
v.nodeID = pExpNode->m_Index;
if (v.mtlID < 0)
{
bHasVoidFaces = true;
}
// extract vertex position and apply world-space modifier to it
int vIdx = face.v[vx[j]];
Point3 pt = mesh.verts[vIdx];
pt = mOffs.PointTransform( pt );
pt = c_FlipTM.PointTransform( pt );
v.index = vIdx;
v.pos = Vec3( pt.x, pt.y, pt.z );
//v.pos *= m_WorldScale;
// extract skinning info
if (bHasSkin)
{
GetSkinInfo( v );
}
// assign normal
if (bHasNormal)
{
v.normal = Vec3( normal.x, normal.y, normal.z );
v.smGroup = face.smGroup;
}
// extract vertex colors
if (bHasVertexColor)
{
const VertColor& vcol = mesh.vertCol[mesh.vcFace[i].t[vx[j]]];
v.color = ColorToDWORD( Color( vcol.x, vcol.y, vcol.z ) );
}
// extract texture coordinates
if (bHasTexCoord)
{
const Point3& texCoord = mesh.tVerts[mesh.tvFace[i].t[vx[j]]];
v.uv.x = texCoord.x;
v.uv.y = 1.0f - texCoord.y;