学习SceneKit之几何体概览

本系列所有文章目录

获取示例代码


什么是几何体

在序篇中,我们已经初步了解到了球形几何体,我们通过SCNSphere.init(radius: 0.3)可以方便的创建一个半径为0.3的球形几何体。SCNSphere是苹果为我们内置的几何体,当然苹果还为我们内置了很多其他几何体,包括SCNPlane, SCNBox, SCNSphere, SCNPyramid, SCNCone, SCNCylinder, SCNCapsule, SCNTube, SCNTorus,这些在例子中都有展示。在计算机的3D世界中,通常使用顶点数组去表示几何体,比如一个三角形可以表示为(-0.5,0.5, 0),(0.5,0.5, 0),(0,-0.5, 0)(x,y,z)是一个顶点的坐标。一个球体可以通过很多个三角形拼接而成,所以对于一个球体而言,表示它的数据就是这些三角形顶点的集合。当然以上只是一个简化的说明,如果你想知道底层显示几何体的方法和原理,可以去看我的OpenGL ES系列文章

几个内置几何体的展示

下面为大家展示几个苹果内置的几何体。

SCNCone(圆锥体)

圆锥体接受三个参数上面的半径,下面的半径和高度。

SCNCone.init(topRadius: 0.1, bottomRadius: 0.5, height: 1)

计算机中的圆都是采用多边形接近的方式制作的,圆锥也不例外,圆锥体提供了radialSegmentCount属性控制组成圆锥的面数,默认是一圈48个面。如果把它调整为3,就会变成这样。


圆锥还提供了一个heightSegmentCount属性控制从上到下切成几份。这两个属性值越大,产生的顶点就越多,模型就越精致,但绘制的性能消耗也就越大。

SCNCapsule(胶囊)

胶囊其实就和我们平时吃的感冒胶囊长得一样,两头是半球形,
中间是圆柱,生成它只需要提供半球半径和高度两个参数。

SCNCapsule.init(capRadius: 0.1, height: 1)


它也有控制生成模型精度的属性radialSegmentCountcapSegmentCountheightSegmentCount

SCNTube(管子)

管子是可以控制管壁厚度的管状几何体。需要提供内径,外径和高度三个参数。

SCNTube.init(innerRadius: 0.3, outerRadius: 0.5, height: 0.4)

SCNTorus(圆环)

圆环可以看作是圈成环的圆柱体,需要提供圆环的半径ringRadius和圆柱体的半径pipeRadius

SCNTorus.init(ringRadius: 0.5, pipeRadius: 0.1)

3D文本

使用SceneKit可以方便的将文字转换成3D几何体,SCNText还支持设置斜切角,让文字模型的转角不那么生硬。使用起来也很方便。另外,SCNText还支持一个flatness属性,这个值越小,生成出来的文字线条越精细,默认为1,当然越精细性能负担也就越重。

let attrs: [NSAttributedStringKey: Any] = [ .font: UIFont.systemFont(ofSize: 1) ]
let textGeometry = SCNText.init(string: NSAttributedString.init(string: "handy\nTool", attributes: attrs), extrusionDepth: 0.4)
textGeometry.chamferRadius = 0.1

生成的文字默认不在中间,我根据文本模型的大小调整它的位置,将它放到中间的位置。具体代码在addGeometry方法中。

SCNShape

SCNShape可以将Path转换成3D模型,其实方式和3D文本一样,或者说3D文本就是利用这个原理生成的。因为文字可以先转换成Path,然后再用SCNShape转换成3D模型,读者可以自己试一试用SCNShape生成一些模型。

总结

系统提供的几何体可以说是简单易用,掌握它们也很轻松。不过对于几何体的学习不会止步于此,后面的文章中将会逐步为大家介绍如何自定义几何体,控制几何体的外观以及LOD技术。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 上次讲了Maya中的Hotbox的用法以及坐标系统,认识了视图的种类以及视角的操纵方式。这次介绍的是3D动画基础物...
    yxssiszx阅读 2,232评论 0 7
  • 温柔倔强也会撒娇投降 天使魔鬼都是我的样 烈似砒霜甜起来像蜜糖 自己导航才能活的更漂亮。 筑起心墙,才不会有失望和...
    大庆袖珍阁阅读 444评论 0 3
  • 原来这是一个伟大的骗局 看着是很美好 但确实是不容易被拆穿 我们总以为外面的世界都很美好 却不知有她的黑暗一面 那...
    半分微凉阅读 185评论 0 6
  • JAVA介绍 Java有很多常见的名词,由于java是通过过java虚拟机运行的,所以在运行java的主机上需要配...
    断尾壁虎V阅读 3,635评论 0 5
  • 似水年华 如天际的流星 转瞬即逝 无情的岁月模糊了 一张张青春洋溢的面容 那些年一起唱过的歌瑶 那些年一起经历的风...
    Julien陆主欢阅读 238评论 7 3