SceneKit_高級06_加載頂點、紋理、法線坐標

SceneKit_入門01_旋轉人物
SceneKit_入門02_如何創建工程
SceneKit_入門03_節點
SceneKit_入門04_燈光
SceneKit_入門05_照相機
SceneKit_入門06_行為動畫
SceneKit_入門07_幾何體
SceneKit_入門08_材質
SceneKit_入門09_物理身體
SceneKit_入門10_物理世界
SceneKit_入門11_粒子系統
SceneKit_入門12_物理行為
SceneKit_入門13_骨骼動畫
SceneKit_中級01_模型之間的過渡動畫
SceneKit_中級02_SCNView 詳細講解
SceneKit_中級03_切換照相機視角
SceneKit_中級04_約束的使用
SceneKit_中級05_力的使用
SceneKit_中級06_場景的切換
SceneKit_中級07_動態修改屬性
SceneKit_中級08_陰影詳解
SceneKit_中級09_碰撞檢測
SceneKit_中級10_濾鏡效果制作
SceneKit_中級11_動畫事件
SceneKit_高級01_GLSL
SceneKit_高級02_粒子系統深入研究
SceneKit_高級03_自定義力
SceneKit_高級04_自定義場景過渡效果
SceneKit_高級05 檢測手勢點擊到節點
SceneKit_高級06_加載頂點、紋理、法線坐標
SceneKit_高級07_SCNProgram用法探究
SceneKit_高級08_天空盒子制作
SceneKit_高級09_霧效果
SceneKit_大神01_掉落的文字
SceneKit_大神02_彈幕來襲
SceneKit_大神03_navigationbar上的3D文字

讓學習成為一種習慣

和你聊聊

學過OpenGL 的同學們,都知道幾個名字頂點坐標,紋理坐標,法線坐標,索引,顏色數據,我們通過相應的api 可以把這些數據加入到GPU 中去,我們知道SceneKit 是封裝了OpenGL 和Metal ,在這里不得不說蘋果公司很人性化,開放給我們的接口還是比較多的,我們經常有一些需求,尤其是3D 開發,后臺會把一些模型數據流傳給前端,前端需要解析出來,然后顯示到頁面上,這個就需要用到今天我們講的技術。

讓人激動不已的兩個類

  • SCNGeometrySource

負責加載頂點數據,紋理數據,顏色數據,紋理坐標

  • SCNGeometryElement

負責加載索引數據,相信學習過OpenGL 的同學對 Element 這個單詞很熟悉吧。

核心技術實戰

今天就是用這個技術加載一個正方形,效果如下

讓學習成為一種習慣
  • 第一步.先定義一下幾個坐標和視圖顏色
    /// 創建頂點坐標
    let vertex:[Float] = [-1,1,-5,
                          1,1,-5,
                          1,-1,-5,
                          -1,-1,-5]
    /// 創建紋理坐標
    let texture:[Float] = [0,0,
                         1,0,
                         1,1,
                         0,1]
    /// 法線索引
    let normal:[Float] = [0,0,1,
                          0,0,1,
                          0,0,1,
                          0,0,1]
    /// 顏色坐標 
    let color:[Float] = [1,0,0,
                         0,1,0,
                         0,0,1,
                         1,1,1]
    /// 創建頂點索引
    let indices:[GLint] = [0,1,2,0,2,3]
  • 第二步 導入游戲框架
 import SceneKit
  • 第三步 創建視圖
  let scnView = SCNView(frame: self.view.bounds)
  self.view.addSubview(scnView)
  scnView.backgroundColor = UIColor.black
  • 第四步 創建場景
  let scene = SCNScene()
  scnView.scene = scene
  • 第五步 創建一個照相機
  let cameraNode  = SCNNode()
  cameraNode.camera = SCNCamera()
  cameraNode.position = SCNVector3(x:0,y:0,z:0)
  scene.rootNode.addChildNode(cameraNode)
  • 第六步 創建一個沒有綁定幾何體的節點
  let bindNode = SCNNode()
  scene.rootNode.addChildNode(bindNode)

注意了,前方高能,打點雞血,抖擻精神。

我們在加載上面的數據之前,要將其轉換為NSData 類型或者Data 類型,所以我們寫個函數統一處理一下

func getData<T>(array:[T])->Data{
    let data:UnsafeMutableRawPointer = malloc(MemoryLayout<T>.size*array.count)
    data.initializeMemory(as: T.self, from:  array)
    return  NSData(bytesNoCopy: data, length: MemoryLayout<T>.size*array.count, freeWhenDone: true) as Data
}

提示:

我們定義為泛型接口,因為數組中的值類型不一樣,MemoryLayout<T>.size 這個swift 里面獲取數據占用內存字節的寫法,ObjectC 是sizeof(T) 的寫法

我們創建SCNGeometrySource 和 SCNGeometryElement 對象

  /// 創建接受頂點的對象
  let vertexSource = SCNGeometrySource(data: getData(array: vertex), semantic: SCNGeometrySource.Semantic.vertex, vectorCount: 4, usesFloatComponents: true, componentsPerVector: 3, bytesPerComponent: MemoryLayout<Float>.size, dataOffset: 0, dataStride: MemoryLayout<Float>.size*3)
  /// 創建紋理坐標對象
  let textureSource = SCNGeometrySource(data: getData(array: texture), semantic: SCNGeometrySource.Semantic.texcoord, vectorCount: 4, usesFloatComponents: true, componentsPerVector: 2, bytesPerComponent: MemoryLayout<Float>.size, dataOffset:0, dataStride: MemoryLayout<Float>.size*2)
  /// 法線坐標對象
  let normalSource = SCNGeometrySource(data: getData(array: normal), semantic: SCNGeometrySource.Semantic.normal, vectorCount: 4, usesFloatComponents: true, componentsPerVector: 3, bytesPerComponent: MemoryLayout<Float>.size, dataOffset: 0, dataStride: MemoryLayout<Float>.size*3)
  /// 顏色對象
let colorSource = SCNGeometrySource(data: getData(array: color), semantic: SCNGeometrySource.Semantic.color, vectorCount: 4, usesFloatComponents: true, componentsPerVector: 3, bytesPerComponent:  MemoryLayout<Float>.size, dataOffset: 0, dataStride: MemoryLayout<Float>.size*3)
  /// 頂點索引
 let indicesElement = SCNGeometryElement(data: getData(array: indices), primitiveType: SCNGeometryPrimitiveType.triangleStrip, primitiveCount: indices.count, bytesPerIndex: MemoryLayout<GLint>.size)

上面就完成了對應對象的創建,接下來創建幾何對象

 let geometry = SCNGeometry(sources: [vertexSource,textureSource,normalSource,colorSource], elements: [indicesElement])

綁定這個幾何對象,到我們對應的節點上去

bindNode.geometry = geometry

總結

本節的內容,教會大家如何動態的加載頂點,紋理,法線,顏色,索引數組,是不是比OpenGL ES 簡單很多,后面還有更神奇的東西要公布出來,敬請期待!


代碼庫,聽說經常給人點贊都當老板了!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容