小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Chai 3D之材質(zhì)和紋理

 3D建模仿真 2023-03-09 發(fā)布于湖北
推薦:將 NSDT場景編輯器 加入你的3D開發(fā)工具鏈

介紹

??在本章中,我們將介紹材料和紋理屬性。這些概念在 CHAI3D 中被廣泛用于描述物體在視覺和觸覺上的外觀。

材料特性

??材料屬性定義表面如何反射光線。他們通過定義顏色值來實現(xiàn)這一點,其方式與燈光大致相同。材質(zhì)具有漫射(直射)光、環(huán)境(散射)光和鏡面反射(反射)光的顏色值,但這些值定義了光分量如何從材質(zhì)表面反射。入射光顏色與相應(yīng)的材料顏色相結(jié)合,結(jié)果顏色就是我們在屏幕上看到的顏色。

??這些材料值僅對光源有意義。例如,如果您的材質(zhì)反射環(huán)境光(即材質(zhì)m_ambient設(shè)置具有顏色值),如果沒有來自光源的環(huán)境光,它仍將顯示為黑色。同樣,漫反射材質(zhì)顏色可能是黃色,但如果漫反射光顏色為綠色,則它將顯示為綠色。

??材質(zhì)的鏡面反射值通常是白色、灰色或黑色,因為它沒有自己的色調(diào),而是反射照射在其上的光線的色調(diào)。將此顏色值視為定義將反射的光的百分比。

??還有一個額外的材質(zhì)設(shè)置,即光澤度,用于定義表面反射的大小。下面是一個簡單的示例,我們在其中定義了對象的環(huán)境、漫反射和鏡面反射分量。

using namespace chai3d;
// setting material properties
object->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);

??關(guān)于材質(zhì)屬性和照明,需要記住的一些重要事項:

1、啟用照明后,將忽略頂點顏色。OpenGL 根據(jù)光線的顏色和照明程度計算每個頂點自己的顏色值。

2、法線對于校正照明至關(guān)重要。頂點法線告訴 OpenGL 平面的角度。根據(jù)平面相對于光線和眼睛位置的角度,OpenGL計算反射光。

3、正常長度很重要!它們的長度都應(yīng)該是 1,否則光線會不均勻地落下。如果您正在構(gòu)建網(wǎng)格并且尚未定義任何頂點法線,只需調(diào)用函數(shù):

using namespace chai3d;
// compute all surface normals
myObject->computeAllNormals(true);

??自發(fā)光材質(zhì)屬性通常會覆蓋漫反射、環(huán)境和鏡面反射分量(除非發(fā)光非常微弱)。自發(fā)光不是輻射的,不會將光線投射到其他物體上。您必須使用其他光源才能執(zhí)行此操作。

??可以通過調(diào)用方法控制對象的透明度級別:

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 STIFFNESS
double m_stiffness;
// DAMPING
// Damping level.
double m_damping;
// VISCOSITY
double m_viscosity;
// FRICTION
double m_staticFriction;
double m_dynamicFriction;
// TEXTURE
double m_textureLevel;
// VIBRATION
double m_vibrationFrequency;
double m_vibrationAmplitude;
// MAGNET
double m_magnetMaxForce;
double m_magnetMaxDistance;
// STICK AND SLIP
double m_stickSlipForceMax;
double m_stickSlipStiffness;
// HAPTIC MODES
bool m_useHapticFriction;
bool m_useHapticTexture;
bool m_useHapticShading;
bool m_hapticFrontSideOfTriangles;
bool m_hapticBackSideOfTriangles;
// SOUND PROPERTIES
cAudioBuffer* m_audioImpactBuffer;
cAudioBuffer* m_audioFrictionBuffer;
double m_audioImpactGain;
double m_audioFrictionGain;
double m_audioFrictionPitchGain;
double m_audioFrictionPitchOffset;

??在進(jìn)一步探索此類的實現(xiàn)時,您會發(fā)現(xiàn)cMaterial只是一個數(shù)據(jù)持有者,實際上并不包含太多用于呈現(xiàn)對象的代碼。其他類(如力模型或觸覺效應(yīng))會咨詢存儲在材料屬性中的值,并使用它們來調(diào)制其結(jié)果。

??可以為組成場景的每個節(jié)點定義材質(zhì)屬性。但是,這并不意味著在渲染通道期間將使用所有材質(zhì)屬性。如果沒有為特定對象編程觸覺效果,則這些參數(shù)將不起作用。

??在同一容器 (cMaterial) 中定義大多數(shù)圖形和觸覺的目的是便于將屬性從一個對象復(fù)制到另一個對象。

紋理屬性

??紋理映射是一種計算機圖形功能,其中單獨的圖像(稱為紋理)被拉伸到一塊 3D 幾何體上,并跟隨它進(jìn)行轉(zhuǎn)換。此圖像也稱為紋理貼圖。這可以是大多數(shù)圖像,但其像素尺寸必須是 2 的冪。(此限制已在某些顯卡上取消,例如最新的ATI或NVIDIA型號)x 和 y 維度不需要是 2 的相同冪,只需是 2 的冪即可。因此,128x512 圖像可以工作,但 129x511 圖像不起作用。

網(wǎng)格對象和映射紋理屬性

(a) 罐頭的三維網(wǎng)格物體。該對象由 8138 個頂點和 14513 個三角形組成。定義了灰色材料屬性(環(huán)境、漫反射和鏡面反射)。

(b) 由 256 x 128 紋素組成的紋理貼圖圖像。

(c) 將紋理貼圖投影到 3D 網(wǎng)格對象上。每個頂點在空間中都有一個位置(x,y,z)以及一個2D紋理坐標(biāo)(s,t)。

(d) 以線框模式渲染的罐頭的 3D 網(wǎng)格。

(e) 說明紋理圖在網(wǎng)格上的投影的組合圖像。

(f) 單個三角形、其三個頂點和投影紋理的圖示。

??此外,為了防止混淆,紋理像素不稱為像素。像素是最終屏幕圖像中的一個點。紋理圖像中的點稱為紋理元素或紋素。同樣,為了避免術(shù)語混淆,紋理的寬度和高度尺寸不稱為 x 和 y。它們被稱為 s 和 t。紋理映射通常不按其實際分辨率坐標(biāo)編制索引。相反,它由與分辨率無關(guān)的坐標(biāo)系進(jìn)行索引。左側(cè)始終為 s = 0,右側(cè)為 s = 1,底部為 t = 0,頂部為 t = 1。因此,在指定指向紋理的坐標(biāo)時,無需了解紋理的分辨率。將 s 和 t 視為衡量您進(jìn)入紋理的方式的比例的度量。

??在 CHAI3D 中,紋理屬性由類 cTexture1d、cTexture2d 和 cTexture3d 定義。每個類都包含許多屬性,這些屬性允許程序員定義紋理映射到對象的確切方式。

??在下面的示例中,我們演示如何在內(nèi)存中加載紋理并將其應(yīng)用于由兩個三角形組成的正方形。

// create a mesh
object = new cMesh();
// add object to world
world->addChild(object);
// create 4 vertices
int vertex0 = object->newVertex();
int vertex1 = object->newVertex();
int vertex2 = object->newVertex();
int vertex3 = object->newVertex();
// assign position, surface normal, and texture coordinates to each vertex
object->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 IDs
object->m_triangles->newTriangle(vertex0, vertex1, vertex2);
object->m_triangles->newTriangle(vertex0, vertex2, vertex3);
// create a texture map
object->m_texture = cTexture2d::create();
// load a texture image file
object->m_texture->loadFromFile(RESOURCE_PATH("myTextureFile.jpg"));
// enable texture mapping
object->setUseTexture(true);
// assign a white material color that is modulated with the texture
object->m_material->setWhite();
// assign some haptic properties
object->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 object
object->createAABBCollisionDetector(toolRadius);

示例 14 紋理 - 4 個正方形,每個正方形由 4 個頂點、2 個三角形和一個紋理映射組成

3D建模學(xué)習(xí)工作室翻譯整理,轉(zhuǎn)載請標(biāo)明出處!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多