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

推薦:將?NSDT場(chǎng)景編輯器?加入你的3D開發(fā)工具鏈

介紹

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

材料特性

??材料屬性定義表面如何反射光線。他們通過定義顏色值來實(shí)現(xiàn)這一點(diǎn),其方式與燈光大致相同。材質(zhì)具有漫射(直射)光、環(huán)境(散射)光和鏡面反射(反射)光的顏色值,但這些值定義了光分量如何從材質(zhì)表面反射。入射光顏色與相應(yīng)的材料顏色相結(jié)合,結(jié)果顏色就是我們?cè)谄聊簧峡吹降念伾?/p>

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

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

??還有一個(gè)額外的材質(zhì)設(shè)置,即光澤度,用于定義表面反射的大小。下面是一個(gè)簡(jiǎn)單的示例,我們?cè)谄渲卸x了對(duì)象的環(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ì)屬性和照明,需要記住的一些重要事項(xiàng):

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

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

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

using namespace chai3d;

// compute all surface normals

myObject->computeAllNormals(true);

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

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

object->setTransparencyLevel(0.5);

??在 CHAI3D 材料中,材料屬性由類 cMaterial 定義。該類包含許多圖形和物理常量,這些常量允許程序員定義對(duì)象的觸覺和圖形渲染方式。

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

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

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

紋理屬性

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

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

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

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

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

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

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

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

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

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

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

// 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 個(gè)正方形,每個(gè)正方形由 4 個(gè)頂點(diǎn)、2 個(gè)三角形和一個(gè)紋理映射組成

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評(píng)論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,786評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,796評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,995評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,230評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,697評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容