本文整理汇总了C++中TriMesh::GetModelBound方法的典型用法代码示例。如果您正苦于以下问题:C++ TriMesh::GetModelBound方法的具体用法?C++ TriMesh::GetModelBound怎么用?C++ TriMesh::GetModelBound使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TriMesh
的用法示例。
在下文中一共展示了TriMesh::GetModelBound方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Sphere
//.........这里部分代码省略.........
}
else
{
vba.Normal<Float3>(i) = Float3(0.0f, 0.0f, 1.0f);
}
}
tcoord = Float2(0.5f, 1.0f);
for (unit = 0; unit < MAX_UNITS; ++unit)
{
if (mHasTCoords[unit])
{
vba.TCoord<Float2>(unit, i) = tcoord;
}
}
++i;
TransformData(vba);
// Generate indices.
IndexBuffer* ibuffer = new0 IndexBuffer(numIndices, 4, mUsage);
int* indices = (int*)ibuffer->GetData();
for (z = 0, zStart = 0; z < zsm3; ++z)
{
int i0 = zStart;
int i1 = i0 + 1;
zStart += rsp1;
int i2 = zStart;
int i3 = i2 + 1;
for (i = 0; i < radialSamples; ++i, indices += 6)
{
if (mInside)
{
indices[0] = i0++;
indices[1] = i2;
indices[2] = i1;
indices[3] = i1++;
indices[4] = i2++;
indices[5] = i3++;
}
else // inside view
{
indices[0] = i0++;
indices[1] = i1;
indices[2] = i2;
indices[3] = i1++;
indices[4] = i3++;
indices[5] = i2++;
}
}
}
// south pole triangles
int numVerticesM2 = numVertices - 2;
for (i = 0; i < radialSamples; ++i, indices += 3)
{
if (mInside)
{
indices[0] = i;
indices[1] = i + 1;
indices[2] = numVerticesM2;
}
else
{
indices[0] = i;
indices[1] = numVerticesM2;
indices[2] = i + 1;
}
}
// north pole triangles
int numVerticesM1 = numVertices-1, offset = zsm3*rsp1;
for (i = 0; i < radialSamples; ++i, indices += 3)
{
if (mInside)
{
indices[0] = i + offset;
indices[1] = numVerticesM1;
indices[2] = i + 1 + offset;
}
else
{
indices[0] = i + offset;
indices[1] = i + 1 + offset;
indices[2] = numVerticesM1;
}
}
delete1(cs);
delete1(sn);
// The duplication of vertices at the seam cause the automatically
// generated bounding volume to be slightly off center. Reset the bound
// to use the true information.
TriMesh* mesh = new0 TriMesh(mVFormat, vbuffer, ibuffer);
mesh->GetModelBound().SetCenter(APoint::ORIGIN);
mesh->GetModelBound().SetRadius(radius);
return mesh;
}
示例2: Torus
//.........这里部分代码省略.........
}
else
{
vba.Normal<Float3>(i) = normal;
}
}
tcoord = Float2(radialFraction, circleFraction);
for (unit = 0; unit < MAX_UNITS; ++unit)
{
if (mHasTCoords[unit])
{
vba.TCoord<Float2>(unit, i) = tcoord;
}
}
++i;
}
vba.Position<Float3>(i) = vba.Position<Float3>(save);
if (mHasNormals)
{
vba.Normal<Float3>(i) = vba.Normal<Float3>(save);
}
tcoord = Float2(1.0f, circleFraction);
for (unit = 0; unit < MAX_UNITS; ++unit)
{
if (mHasTCoords[unit])
{
vba.TCoord<Float2>(unit, i) = tcoord;
}
}
++i;
}
// Duplicate the cylinder ends to form a torus.
for (r = 0; r <= radialSamples; ++r, ++i)
{
vba.Position<Float3>(i) = vba.Position<Float3>(r);
if (mHasNormals)
{
vba.Normal<Float3>(i) = vba.Normal<Float3>(r);
}
for (unit = 0; unit < MAX_UNITS; ++unit)
{
if (mHasTCoords[unit])
{
vba.TCoord<Float2>(unit, i) =
Float2(vba.TCoord<Float2>(unit, r)[0], 1.0f);
}
}
}
TransformData(vba);
// Generate indices.
IndexBuffer* ibuffer = new0 IndexBuffer(numIndices, 4, mUsage);
int* indices = (int*)ibuffer->GetData();
int cStart = 0;
for (c = 0; c < circleSamples; ++c)
{
int i0 = cStart;
int i1 = i0 + 1;
cStart += radialSamples + 1;
int i2 = cStart;
int i3 = i2 + 1;
for (i = 0; i < radialSamples; ++i, indices += 6)
{
if (mInside)
{
indices[0] = i0++;
indices[1] = i1;
indices[2] = i2;
indices[3] = i1++;
indices[4] = i3++;
indices[5] = i2++;
}
else // inside view
{
indices[0] = i0++;
indices[1] = i2;
indices[2] = i1;
indices[3] = i1++;
indices[4] = i2++;
indices[5] = i3++;
}
}
}
// The duplication of vertices at the seam cause the automatically
// generated bounding volume to be slightly off center. Reset the bound
// to use the true information.
TriMesh* mesh = new0 TriMesh(mVFormat, vbuffer, ibuffer);
mesh->GetModelBound().SetCenter(APoint::ORIGIN);
mesh->GetModelBound().SetRadius(outerRadius);
return mesh;
}
示例3: Cylinder
//.........这里部分代码省略.........
vba.Position<Float3>(i) = vba.Position<Float3>(save);
if (mHasNormals)
{
vba.Normal<Float3>(i) = vba.Normal<Float3>(save);
}
tcoord = Float2(1.0f, axisFraction);
for (unit = 0; unit < MAX_UNITS; ++unit)
{
if (mHasTCoords[unit])
{
vba.TCoord<Float2>(0, i) = tcoord;
}
}
++i;
}
TransformData(vba);
// Generate indices.
IndexBuffer* ibuffer = new0 IndexBuffer(numIndices, 4, mUsage);
int* indices = (int*)ibuffer->GetData();
for (a = 0, aStart = 0; a < axisSamples-1; ++a)
{
int i0 = aStart;
int i1 = i0 + 1;
aStart += radialSamples + 1;
int i2 = aStart;
int i3 = i2 + 1;
for (i = 0; i < radialSamples; ++i, indices += 6)
{
if (mInside)
{
indices[0] = i0++;
indices[1] = i2;
indices[2] = i1;
indices[3] = i1++;
indices[4] = i2++;
indices[5] = i3++;
}
else // outside view
{
indices[0] = i0++;
indices[1] = i1;
indices[2] = i2;
indices[3] = i1++;
indices[4] = i3++;
indices[5] = i2++;
}
}
}
delete1(cs);
delete1(sn);
mesh = new0 TriMesh(mVFormat, vbuffer, ibuffer);
}
else
{
mesh = Sphere(axisSamples, radialSamples, radius);
VertexBuffer* vbuffer = mesh->GetVertexBuffer();
int numVertices = vbuffer->GetNumElements();
VertexBufferAccessor vba(mVFormat, vbuffer);
// Flatten sphere at poles.
float hDiv2 = 0.5f*height;
vba.Position<Float3>(numVertices-2)[2] = -hDiv2; // south pole
vba.Position<Float3>(numVertices-1)[2] = +hDiv2; // north pole
// Remap z-values to [-h/2,h/2].
float zFactor = 2.0f/(axisSamples-1);
float tmp0 = radius*(-1.0f + zFactor);
float tmp1 = 1.0f/(radius*(+1.0f - zFactor));
for (int i = 0; i < numVertices-2; ++i)
{
Float3& pos = vba.Position<Float3>(i);
pos[2] = hDiv2*(-1.0f + tmp1*(pos[2] - tmp0));
float adjust = radius*Mathf::InvSqrt(pos[0]*pos[0] +
pos[1]*pos[1]);
pos[0] *= adjust;
pos[1] *= adjust;
}
TransformData(vba);
if (mHasNormals)
{
mesh->UpdateModelSpace(Visual::GU_NORMALS);
}
}
// The duplication of vertices at the seam causes the automatically
// generated bounding volume to be slightly off center. Reset the bound
// to use the true information.
float maxDist = Mathf::Sqrt(radius*radius + height*height);
mesh->GetModelBound().SetCenter(APoint::ORIGIN);
mesh->GetModelBound().SetRadius(maxDist);
return mesh;
}