what is setTexCoordArray

本文详细解释了纹理坐标在OpenGL中的基本概念及其在几何体上的应用方式,包括如何为每个顶点设置2D坐标来关联纹理点和顶点,以及如何通过设置纹理坐标数组来实现纹理的正确映射。
Texture coordinates is a basic way to apply a texture on a geometry.
For each vertex, you give a 2D coordinate data to associate a vertex and a
texture point. OpenGl will interpolate the texture pixel between each
vertex, depending on theses coordinates.

The 2D texture coordinate have to be like this in your texture image:

[0,0]        [1,0]
  |------------|
  |            |
  |            |
  |            |
  |            |
  |------------|
[0,1]        [1,1]


In your example, with a single file of texture, you set the texture for each
side.
For each texture you set in OSG, you can set a texCoordinateArray.
The index you set  pyramidGeometry->setTexCoordArray(*0*,texcoords);
correspond to the texture index you set before, when setting the texture.

Have a look on Texture coordinate on the web, you'll find a lot of
explanations.
原有函数中其实没用到参数deltaAngle,去掉该参数,重新给你一份代码,还是上述需求,要增加一个顶面,扣除一个小圆,增加一个参数r.static osg::Geometry* createCircleBottlePart(const std::vector<double>& radiuses, const std::vector<osg::Vec3d>& centers, osg::Quat rot) { osg::ref_ptr<osg::Vec3Array> va = new osg::Vec3Array; osg::ref_ptr<osg::Vec3Array> na = new osg::Vec3Array; osg::ref_ptr<osg::Vec2Array> ta = new osg::Vec2Array; osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; geom->setVertexArray(va); geom->setNormalArray(na, osg::Array::BIND_PER_VERTEX); geom->setTexCoordArray(0, ta); osg::Vec3d bottomC = centers.back(); for (size_t i = 1; i < centers.size(); ++i) { double r1 = radiuses[i - 1]; double r2 = radiuses[i]; const osg::Vec3d& c1 = centers[i - 1]; const osg::Vec3d& c2 = centers[i]; float tcy1 = (centers[i - 1].z() - bottomC.z()) * 0.6; float tcy2 = (centers[i].z() - bottomC.z()) * 0.6; osg::ref_ptr<osg::DrawElementsUInt> de = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLE_STRIP); osg::Vec3d cdir(1, 0, 0); for (size_t si = 0; si < CIRCLE_POINT_NUM; ++si) { osg::Vec3d dir = rot * cdir; cdir = dir; osg::Vec3d v1 = c1 + dir * r1; osg::Vec3d v2 = c2 + dir * r2; osg::Vec3d n1 = v1 - c1; n1.normalize(); osg::Vec3d n2 = v2 - c2; n2.normalize(); float tcx = (2.0 * osg::PI * radiuses.back()) * 0.6 * (float)si / (float)CIRCLE_SEGMENT_NUM; osg::Vec2 tc1(tcx, tcy1); osg::Vec2 tc2(tcx, tcy2); de->push_back(va->size() + 0); de->push_back(va->size() + 1); va->push_back(v1); va->push_back(v2); na->push_back(n1); na->push_back(n2); ta->push_back(tc1); ta->push_back(tc2); } geom->addPrimitiveSet(de); } return geom.release(); }
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值