- 2024年10月
- 2021年5月
- 2020年8月
- 2020年6月
- 2020年5月
- 2019年1月
- 2018年8月
- 2018年6月
- 2018年5月
- 2018年3月
- 2018年1月
- 2017年12月
- 2017年11月
- 2017年10月
- 2017年9月
- 2017年8月
- 2017年7月
- 2017年6月
- 2016年11月
- 2013年9月
- 2013年8月
- 2013年6月
- 2013年5月
- 2013年4月
- 2013年3月
- 2013年2月
- 2013年1月
- 2012年12月
- 2012年11月
- 2012年10月
- 2012年9月
- 2012年6月
- 2012年5月
- 2012年4月
- 2012年2月
- 2011年7月
- 2011年5月
- 2011年4月
- 2011年2月
- 2010年12月
- 2010年11月
- 2010年10月
- 2010年9月
- 2010年8月
- 2010年7月
- 2010年6月
- 2010年5月
- 2010年4月
- 2010年3月
- 2010年2月
- 2010年1月
- 2009年12月
- 2008年2月
- 2008年1月
- 2007年12月
- 2007年5月
- 2007年4月
- 2007年3月
- 2007年2月
SceneKitのプリミティブな形状のデータの中身を見る / magicien
ARKitによってSceneKitの需要が多少なり増すかもしれないので、SceneKitについていくつかメモを残しておこう。まずは、SCNBox、SCNSphereなどの頂点やテクスチャ座標などがどうなっているかを見るために生データを取得する方法について。
SceneKitの場合、3Dの形状はSCNGeometryクラスで表現する。元から用意されている、SCNBox、SCNSphere等はSCNGeometryを継承したもの。
JSceneKitでこれらのクラスを実装するために中身を覗いた時に使ったコードはこんな感じ。
let sphere = SCNSphere() // 頂点番号の一覧表示 let element = sphere.geometryElement(at: 0) element.data.withUnsafeBytes { (p: UnsafePointer<UInt16>) in for i in 0..<element.primitiveCount { let i1 = p[i*3 + 0] let i2 = p[i*3 + 1] let i3 = p[i*3 + 2] print("\(i): \(i1), \(i2), \(i3)") } } // 頂点座標の一覧表示 let v = sphere.getGeometrySources(for: .vertex)[0] v.data.withUnsafeBytes { (p: UnsafePointer<Float32>) in for i in 0..<v.vectorCount { let index = (i * v.dataStride + v.dataOffset) / 4 let i1 = p[index + 0] let i2 = p[index + 1] let i3 = p[index + 2] print("\(i): \(i1), \(i2), \(i3)") } } // 法線の一覧表示 let n = sphere.getGeometrySources(for: .normal)[0] n.data.withUnsafeBytes { (p: UnsafePointer<Float32>) in for i in 0..<n.vectorCount { let index = (i * n.dataStride + n.dataOffset) / 4 let i1 = p[index + 0] let i2 = p[index + 1] let i3 = p[index + 2] print("\(i): \(i1), \(i2), \(i3)") } } // テクスチャ座標の一覧表示 let t = sphere.getGeometrySources(for: .texcoord)[0] t.data.withUnsafeBytes { (p: UnsafePointer<Float32>) in for i in 0..<t.vectorCount { let index = (i * t.dataStride + t.dataOffset) / 4 let i1 = p[index + 0] let i2 = p[index + 1] print("\(i): \(i1), \(i2)") } }Appleのドキュメンテーションだと、getGeometrySourcesじゃなくて、sources(for semantic: SCNGeometrySource.Semantic) になってる...新APIだと関数名が変わっているかもしれない。
getGeometrySourcesで取得できる値の種類は他にもあったりするけれど、SCNBoxやSCNSphereが持っているデータは、vertex、normal、texcoordがそれぞれ1つずつだけ。
SCNGeometryの場合、materialsは空の配列になっているけれど、SCNBox等は、デフォルトのSCNMaterialが一つ入っているみたい。
新APIだと、このSCNGeometryにtesellatorなる変数が追加されていて、SCNBoxの角をめちゃくちゃ滑らかにして遊ぶこともできるようだ。
この記事のURL: https://darkhorse2.0spec.jp/213/
2017/06/18(Sun) 12:11:54