本文整理汇总了C++中Vector_3::setZero方法的典型用法代码示例。如果您正苦于以下问题:C++ Vector_3::setZero方法的具体用法?C++ Vector_3::setZero怎么用?C++ Vector_3::setZero使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Vector_3
的用法示例。
在下文中一共展示了Vector_3::setZero方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: createArrowElement
/******************************************************************************
* Creates the geometry for a single arrow element.
******************************************************************************/
void OpenGLArrowPrimitive::createArrowElement(int index, const Point3& pos, const Vector3& dir, const ColorA& color, FloatType width)
{
const float arrowHeadRadius = width * 2.5f;
const float arrowHeadLength = arrowHeadRadius * 1.8f;
if(shadingMode() == NormalShading) {
// Build local coordinate system.
Vector_3<float> t, u, v;
float length = dir.length();
if(length != 0) {
t = dir / length;
if(dir.y() != 0 || dir.x() != 0)
u = Vector_3<float>(dir.y(), -dir.x(), 0);
else
u = Vector_3<float>(-dir.z(), 0, dir.x());
u.normalize();
v = u.cross(t);
}
else {
t.setZero();
u.setZero();
v.setZero();
}
ColorAT<float> c = color;
Point_3<float> v1 = pos;
Point_3<float> v2;
Point_3<float> v3 = v1 + dir;
float r;
if(length > arrowHeadLength) {
v2 = v1 + t * (length - arrowHeadLength);
r = arrowHeadRadius;
}
else {
v2 = v1;
r = arrowHeadRadius * length / arrowHeadLength;
}
OVITO_ASSERT(_mappedVerticesWithNormals);
VertexWithNormal* vertex = _mappedVerticesWithNormals + (index * _verticesPerElement);
// Generate vertices for cylinder.
for(int i = 0; i <= _cylinderSegments; i++) {
Vector_3<float> n = _cosTable[i] * u + _sinTable[i] * v;
Vector_3<float> d = n * width;
vertex->pos = v1 + d;
vertex->normal = n;
vertex->color = c;
vertex++;
vertex->pos = v2 + d;
vertex->normal = n;
vertex->color = c;
vertex++;
}
// Generate vertices for head cone.
for(int i = 0; i <= _cylinderSegments; i++) {
Vector_3<float> n = _cosTable[i] * u + _sinTable[i] * v;
Vector_3<float> d = n * r;
vertex->pos = v2 + d;
vertex->normal = n;
vertex->color = c;
vertex++;
vertex->pos = v3;
vertex->normal = n;
vertex->color = c;
vertex++;
}
// Generate vertices for cylinder cap.
for(int i = 0; i < _cylinderSegments; i++) {
Vector_3<float> n = _cosTable[i] * u + _sinTable[i] * v;
Vector_3<float> d = n * width;
vertex->pos = v1 + d;
vertex->normal = Vector_3<float>(0,0,-1);
vertex->color = c;
vertex++;
}
// Generate vertices for cone cap.
for(int i = 0; i < _cylinderSegments; i++) {
Vector_3<float> n = _cosTable[i] * u + _sinTable[i] * v;
Vector_3<float> d = n * r;
vertex->pos = v2 + d;
vertex->normal = Vector_3<float>(0,0,-1);
vertex->color = c;
vertex++;
}
}
else if(shadingMode() == FlatShading) {
Vector_3<float> t;
float length = dir.length();
if(length != 0)
t = dir / length;
else
//.........这里部分代码省略.........
示例2: createCylinderElement
/******************************************************************************
* Creates the geometry for a single cylinder element.
******************************************************************************/
void OpenGLArrowPrimitive::createCylinderElement(int index, const Point3& pos, const Vector3& dir, const ColorA& color, FloatType width)
{
if(_usingGeometryShader && (shadingMode() == FlatShading || renderingQuality() == HighQuality)) {
OVITO_ASSERT(_mappedVerticesWithElementInfo);
OVITO_ASSERT(_verticesPerElement == 1);
VertexWithElementInfo* vertex = _mappedVerticesWithElementInfo + index;
vertex->pos = vertex->base = pos;
vertex->dir = dir;
vertex->color = color;
vertex->radius = width;
return;
}
if(shadingMode() == NormalShading) {
// Build local coordinate system.
Vector_3<float> t, u, v;
float length = dir.length();
if(length != 0) {
t = dir / length;
if(dir.y() != 0 || dir.x() != 0)
u = Vector_3<float>(dir.y(), -dir.x(), 0);
else
u = Vector_3<float>(-dir.z(), 0, dir.x());
u.normalize();
v = u.cross(t);
}
else {
t.setZero();
u.setZero();
v.setZero();
}
ColorAT<float> c = color;
Point_3<float> v1 = pos;
Point_3<float> v2 = v1 + dir;
if(renderingQuality() != HighQuality) {
OVITO_ASSERT(_mappedVerticesWithNormals);
VertexWithNormal* vertex = _mappedVerticesWithNormals + (index * _verticesPerElement);
// Generate vertices for cylinder mantle.
for(int i = 0; i <= _cylinderSegments; i++) {
Vector_3<float> n = _cosTable[i] * u + _sinTable[i] * v;
Vector_3<float> d = n * width;
vertex->pos = v1 + d;
vertex->normal = n;
vertex->color = c;
vertex++;
vertex->pos = v2 + d;
vertex->normal = n;
vertex->color = c;
vertex++;
}
// Generate vertices for first cylinder cap.
for(int i = 0; i < _cylinderSegments; i++) {
Vector_3<float> n = _cosTable[i] * u + _sinTable[i] * v;
Vector_3<float> d = n * width;
vertex->pos = v1 + d;
vertex->normal = Vector_3<float>(0,0,-1);
vertex->color = c;
vertex++;
}
// Generate vertices for second cylinder cap.
for(int i = _cylinderSegments - 1; i >= 0; i--) {
Vector_3<float> n = _cosTable[i] * u + _sinTable[i] * v;
Vector_3<float> d = n * width;
vertex->pos = v2 + d;
vertex->normal = Vector_3<float>(0,0,1);
vertex->color = c;
vertex++;
}
}
else {
// Create bounding box geometry around cylinder for raytracing.
OVITO_ASSERT(_mappedVerticesWithElementInfo);
VertexWithElementInfo* vertex = _mappedVerticesWithElementInfo + (index * _verticesPerElement);
OVITO_ASSERT(_verticesPerElement == 14);
u *= width;
v *= width;
Point3 corners[8] = {
v1 - u - v,
v1 - u + v,
v1 + u - v,
v1 + u + v,
v2 - u - v,
v2 - u + v,
v2 + u + v,
v2 + u - v
};
const static size_t stripIndices[14] = { 3,2,6,7,4,2,0,3,1,6,5,4,1,0 };
for(int i = 0; i < 14; i++, vertex++) {
vertex->pos = corners[stripIndices[i]];
vertex->base = v1;
vertex->dir = dir;
//.........这里部分代码省略.........