乐趣区

关于编辑器:Chai-3D之材质和纹理

举荐:将 https://ted.sinoccdc.cn/?sourceid=9 退出你的 3D 开发工具链介绍  

在本章中,咱们将介绍资料和纹理属性。这些概念在 CHAI3D 中被宽泛用于形容物体在视觉和触觉上的外观。资料个性  资料属性定义外表如何反射光线。他们通过定义色彩值来实现这一点,其形式与灯光大致相同。材质具备漫射(直射)光、环境(散射)光和镜面反射(反射)光的色彩值,但这些值定义了光重量如何从材质外表反射。入射光色彩与相应的资料色彩相结合,后果色彩就是咱们在屏幕上看到的色彩。这些资料值仅对光源有意义。例如,如果您的材质反射环境光(即材质 m_ambient 设置具备色彩值),如果没有来自光源的环境光,它仍将显示为彩色。同样,漫反射材质色彩可能是黄色,但如果漫反射光色彩为绿色,则它将显示为绿色。材质的镜面反射值通常是红色、灰色或彩色,因为它没有本人的色调,而是反射照耀在其上的光线的色调。将此色彩值视为定义将反射的光的百分比。还有一个额定的材质设置,即光泽度,用于定义外表反射的大小。上面是一个简略的示例,咱们在其中定义了对象的环境、漫反射和镜面反射重量。using namespace chai3d;// setting material propertiesobject->m_material.m_ambient.set(0.1, 0.1, 0.6);object->m_material.m_diffuse.set(0.3, 0.3, 0.9);object->m_material.m_specular.set(1.0, 1.0, 1.0);  对于材质属性和照明,须要记住的一些重要事项:1、启用照明后,将疏忽顶点色彩。OpenGL 依据光线的色彩和照明水平计算每个顶点本人的色彩值。2、法线对于校对照明至关重要。顶点法线通知 OpenGL 立体的角度。依据立体绝对于光线和眼睛地位的角度,OpenGL 计算反射光。3、失常长度很重要!它们的长度都应该是 1,否则光线会不平均地落下。如果您正在构建网格并且尚未定义任何顶点法线,只需调用函数:using namespace chai3d;// compute all surface normalsmyObject->computeAllNormals(true);  自发光材质属性通常会笼罩漫反射、环境和镜面反射重量(除非发光十分强劲)。自发光不是辐射的,不会将光线投射到其余物体上。您必须应用其余光源能力执行此操作。能够通过调用办法管制对象的透明度级别:object->setTransparencyLevel(0.5);  在 CHAI3D 资料中,资料属性由类 cMaterial 定义。该类蕴含许多图形和物理常量,这些常量容许程序员定义对象的触觉和图形渲染形式。using namespace chai3d;// GRAPHIC PROPERTIES:cColorf m_ambient;cColorf m_diffuse;cColorf m_specular;cColorf m_emission;GLuint m_shininess;// SURFACE STIFFNESSdouble m_stiffness;// DAMPING// Damping level.double m_damping;// VISCOSITYdouble m_viscosity;// FRICTIONdouble m_staticFriction;double m_dynamicFriction;// TEXTUREdouble m_textureLevel;// VIBRATIONdouble m_vibrationFrequency;double m_vibrationAmplitude;// MAGNETdouble m_magnetMaxForce;double m_magnetMaxDistance;// STICK AND SLIPdouble m_stickSlipForceMax;double m_stickSlipStiffness;// HAPTIC MODESbool m_useHapticFriction;bool m_useHapticTexture;bool m_useHapticShading;bool m_hapticFrontSideOfTriangles;bool m_hapticBackSideOfTriangles;// SOUND PROPERTIEScAudioBuffer m_audioImpactBuffer;cAudioBuffer m_audioFrictionBuffer;double m_audioImpactGain;double m_audioFrictionGain;double m_audioFrictionPitchGain;double m_audioFrictionPitchOffset;  在进一步摸索此类的实现时,您会发现 cMaterial 只是一个数据持有者,实际上并不蕴含太多用于出现对象的代码。其余类(如力模型或触觉效应)会征询存储在资料属性中的值,并应用它们来调制其后果。能够为组成场景的每个节点定义材质属性。然而,这并不意味着在渲染通道期间将应用所有材质属性。如果没有为特定对象编程触觉成果,则这些参数将不起作用。在同一容器(cMaterial)中定义大多数图形和触觉的目标是便于将属性从一个对象复制到另一个对象。纹理属性  纹理映射是一种计算机图形性能,其中独自的图像(称为纹理)被拉伸到一块 3D 几何体上,并追随它进行转换。此图像也称为纹理贴图。这能够是大多数图像,但其像素尺寸必须是 2 的幂。(此限度已在某些显卡上勾销,例如最新的 ATI 或 NVIDIA 型号)x 和 y 维度不须要是 2 的雷同幂,只需是 2 的幂即可。因而,128×512 图像能够工作,但 129×511 图像不起作用。

网格对象和映射纹理属性(a)罐头的三维网格物体。该对象由 8138 个顶点和 14513 个三角形组成。定义了灰色资料属性(环境、漫反射和镜面反射)。(b)由 256 x 128 纹素组成的纹理贴图图像。(c)将纹理贴图投影到 3D 网格对象上。每个顶点在空间中都有一个地位(x,y,z)以及一个 2D 纹理坐标(s,t)。(d)以线框模式渲染的罐头的 3D 网格。(e)阐明纹理图在网格上的投影的组合图像。(f)单个三角形、其三个顶点和投影纹理的图示。此外,为了避免混同,纹理像素不称为像素。像素是最终屏幕图像中的一个点。纹理图像中的点称为纹理元素或纹素。同样,为了防止术语混同,纹理的宽度和高度尺寸不称为 x 和 y。它们被称为 s 和 t。纹理映射通常不按其理论分辨率坐标编制索引。相同,它由与分辨率无关的坐标系进行索引。左侧始终为 s = 0,右侧为 s = 1,底部为 t = 0,顶部为 t = 1。因而,在指定指向纹理的坐标时,无需理解纹理的分辨率。将 s 和 t 视为掂量您进入纹理的形式的比例的度量。在 CHAI3D 中,纹理属性由类 cTexture1d、cTexture2d 和 cTexture3d 定义。每个类都蕴含许多属性,这些属性容许程序员定义纹理映射到对象的确切形式。在上面的示例中,咱们演示如何在内存中加载纹理并将其利用于由两个三角形组成的正方形。// create a meshobject = new cMesh();// add object to worldworld->addChild(object);// create 4 verticesint vertex0 = object->newVertex();int vertex1 = object->newVertex();int vertex2 = object->newVertex();int vertex3 = object->newVertex();// assign position, surface normal, and texture coordinates to each vertexobject->m_vertices->setLocalPos(vertex0,-0.1,-0.1, 0.0);object->m_vertices->setNormal(vertex0, 0.0, 0.0, 1.0);object->m_vertices->setTexCoord(vertex0, 0.0, 0.0);object->m_vertices->setLocalPos(vertex1, 0.1,-0.1, 0.0);object->m_vertices->setNormal(vertex1, 0.0, 0.0, 1.0);object->m_vertices->setTexCoord(vertex1, 1.0, 0.0);object->m_vertices->setLocalPos(vertex2, 0.1, 0.1, 0.0);object->m_vertices->setNormal(vertex2, 0.0, 0.0, 1.0);object->m_vertices->setTexCoord(vertex2, 1.0, 1.0);object->m_vertices->setLocalPos(vertex3,-0.1, 0.1, 0.0);object->m_vertices->setNormal(vertex3, 0.0, 0.0, 1.0);object->m_vertices->setTexCoord(vertex3, 0.0, 1.0);// create two triangles by assigning their vertex IDsobject->m_triangles->newTriangle(vertex0, vertex1, vertex2);object->m_triangles->newTriangle(vertex0, vertex2, vertex3);// create a texture mapobject->m_texture = cTexture2d::create();// load a texture image fileobject->m_texture->loadFromFile(RESOURCE_PATH(“myTextureFile.jpg”));// enable texture mappingobject->setUseTexture(true);// assign a white material color that is modulated with the textureobject->m_material->setWhite();// assign some haptic propertiesobject->m_material->setStiffness(500);object->m_material->setStaticFriction(0.3);object->m_material->setDynamicFriction(0.2);object->m_material->setTextureLevel(1.0);// create a collision detector for this objectobject->createAABBCollisionDetector(toolRadius);

示例 14 纹理 – 4 个正方形,每个正方形由 4 个顶点、2 个三角形和一个纹理映射组成

退出移动版