歡迎小伙伴們的到來(lái)~
(一)介紹
如果小伙伴們還沒(méi)對(duì)ARKit有任何的了解可以先看看我前面幾章的介紹再來(lái)更好的看本章內(nèi)容
一颤芬、ARKit初探索
二、SCNGeometry代碼創(chuàng)建幾何體
三套鹅、ARKit涂鴉①
本次的代碼已上傳 github
終于有時(shí)間來(lái)繼續(xù)更新文章~~~
上一次給大家簡(jiǎn)單的介紹了一下使用SCNGeometry在平面上繪制線條的方法站蝠,但是SCNGeometry無(wú)法設(shè)置線條的寬度,為了使我們繪制出來(lái)的線條圓滑一些卓鹿,我決定使用SCNGeometry繪制圓柱來(lái)代表線條菱魔,圓柱的直徑就是線條的寬度。
本次我還在其中加入了撤銷吟孙、更改顏色澜倦、更改線條寬度等功能
先看下本次分享東西的效果圖
(二)開(kāi)始~
首先我們來(lái)看一張圖片
從上圖我們可以看到要繪制一個(gè)圓柱聚蝶,可以使用逐步逼近法,用一個(gè)個(gè)長(zhǎng)方形拼合來(lái)逐步逼近圓藻治,這里我們使用兩個(gè)三角形組合一個(gè)長(zhǎng)方形碘勉。
1.獲取屏幕上手指劃過(guò)的位置相對(duì)真實(shí)世界對(duì)象的位置
2.拿到本次屏幕上劃過(guò)的位置,計(jì)算出兩點(diǎn)間圓柱上長(zhǎng)方形的所有頂點(diǎn)。
3.然后使用SCNGeometry繪制三角扇鏈接所有頂點(diǎn)。
下面我們就來(lái)實(shí)現(xiàn)所有的步驟:
1. 獲取屏幕上手指劃過(guò)的位置相對(duì)真實(shí)世界對(duì)象的位置
實(shí)現(xiàn)步驟
詳細(xì)見(jiàn)上一章ARKit涂鴉①
或查看代碼 github (MQARSCNController+AddNode.swift -> touchesMoved())
2.拿到本次屏幕上劃過(guò)的位置吠式,計(jì)算出兩點(diǎn)間圓柱上長(zhǎng)方形的所有頂點(diǎn)
關(guān)鍵代碼,具體查看項(xiàng)目MQNode類中addVertices方法
//將圓分成40等份,迭代出當(dāng)前點(diǎn)對(duì)應(yīng)的圓所有頂點(diǎn)
for index in 0...40 {
//計(jì)算本次[弧度](https://baike.baidu.com/item/%E5%BC%A7%E5%BA%A6/1533188?fr=aladdin),360°角=2π弧度集峦,分成40份
let t = Double(index) * (Double.pi * 2 / 40)
//計(jì)算當(dāng)前點(diǎn)對(duì)應(yīng)的圓所有頂點(diǎn)
let s = atan(-(Double(previousVertice.x)*cos(t) + Double(previousVertice.y)*sin(t)) / Double(previousVertice.z))
let xt = Double(currenVertice.x) + r * cos(s) * cos(t)
let yt = Double(currenVertice.y) + r * cos(s) * sin(t)
let zt = Double(currenVertice.z) + r * sin(s)
let ver = SCNVector3Make(Float(xt), Float(yt), Float(zt))
//保存本次所有頂點(diǎn),用于和下次的點(diǎn)進(jìn)行連接
tempPreviousVertices.append(ver)
/*
-------上次點(diǎn)
||||||| 一一對(duì)應(yīng)添加
-------本次點(diǎn)
如2-1圖所示
*/
//添加本次點(diǎn)
roundLineVertices.append(ver)
//添加上次對(duì)應(yīng)點(diǎn)
roundLineVertices.append(roundPreviousVertices[index])
//添加頂點(diǎn)索引
let verticesCount = UInt32(roundLineVertices.count)
roundLineIndices.append(verticesCount-2)
roundLineIndices.append(verticesCount-1)
}
3.然后使用SCNGeometry繪制三角扇鏈接所有頂點(diǎn)。
關(guān)鍵代碼,具體查看項(xiàng)目MQNode類中addVertices方法
//創(chuàng)建SCNGeometry
let geometry = SCNGeometry(sources: [SCNGeometrySource(vertices: roundLineVertices)], elements: [SCNGeometryElement(indices: roundLineIndices, primitiveType: .triangleStrip)])
//創(chuàng)建渲染器
let material = SCNMaterial()
material.isDoubleSided = true
material.diffuse.contents = MQARSCNController.sharedInstance.linecolour
geometry.firstMaterial = material
//把本次的圓柱添加到node上
let node = SCNNode(geometry: geometry)
self.addChildNode(node)
本章內(nèi)容就到這里感謝小伙伴們的到來(lái)~
代碼已經(jīng)上傳github