- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在不更改任何枢轴点的情况下制作带有三角形的六边形网格,但我似乎无法正确定位三角形以制作单个六边形。我正在使用 UIBezierPaths
创建 SCNNodes
以形成三角形,然后旋转贝塞尔路径。这似乎工作正常,直到我尝试使用参数方程将三角形定位在一个圆圈周围以形成六边形,然后它们最终没有处于正确的位置。你能帮我找出我在哪里做错了吗?
class TrianglePlane: SCNNode {
var size: CGFloat = 0.1
var coords: SCNVector3 = SCNVector3Zero
var innerCoords: Int = 0
init(coords: SCNVector3, innerCoords: Int, identifier: Int) {
super.init()
self.coords = coords
self.innerCoords = innerCoords
setup()
}
init(identifier: Int) {
super.init()
// super.init(identifier: identifier)
setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setup() {
let myPath = path()
let geo = SCNShape(path: myPath, extrusionDepth: 0)
geo.firstMaterial?.diffuse.contents = UIColor.red
geo.firstMaterial?.blendMode = .multiply
self.geometry = geo
}
func path() -> UIBezierPath {
let max: CGFloat = self.size
let min: CGFloat = 0
let bPath = UIBezierPath()
bPath.move(to: .zero)
bPath.addLine(to: CGPoint(x: max / 2,
y: UIBezierPath.middlePeak(height: max)))
bPath.addLine(to: CGPoint(x: max, y: min))
bPath.close()
return bPath
}
}
extension TrianglePlane {
static func generateHexagon() -> [TrianglePlane] {
var myArr: [TrianglePlane] = []
let colors = [UIColor.red, UIColor.green,
UIColor.yellow, UIColor.systemTeal,
UIColor.cyan, UIColor.magenta]
for i in 0 ..< 6 {
let tri = TrianglePlane(identifier: 0)
tri.geometry?.firstMaterial?.diffuse.contents = colors[i]
tri.position = SCNVector3( -0.05, 0, -0.5)
// Rotate bezier path
let angleInDegrees = (Float(i) + 1) * 180.0
print(angleInDegrees)
let angle = CGFloat(deg2rad(angleInDegrees))
let geo = tri.geometry as! SCNShape
let path = geo.path!
path.rotateAroundCenter(angle: angle)
geo.path = path
// Position triangle in hexagon
let radius = Float(tri.size)/2
let deg: Float = Float(i) * 60
let radians = deg2rad(-deg)
let x1 = tri.position.x + radius * cos(radians)
let y1 = tri.position.y + radius * sin(radians)
tri.position.x = x1
tri.position.y = y1
myArr.append(tri)
}
return myArr
}
static func deg2rad(_ number: Float) -> Float {
return number * Float.pi / 180
}
}
extension UIBezierPath {
func rotateAroundCenter(angle: CGFloat) {
let center = self.bounds.center
var transform = CGAffineTransform.identity
transform = transform.translatedBy(x: center.x, y: center.y)
transform = transform.rotated(by: angle)
transform = transform.translatedBy(x: -center.x, y: -center.y)
self.apply(transform)
}
static func middlePeak(height: CGFloat) -> CGFloat {
return sqrt(3.0) / 2 * height
}
}
extension CGRect {
var center : CGPoint {
return CGPoint(x:self.midX, y:self.midY)
}
}
What it currently looks like:
What it SHOULD look like:
最佳答案
我创建了两个版本 - SceneKit 和 RealityKit。
组成六边形的最简单方法是使用六个非均匀缩放的 SCNPyramids
(平面)及其偏移的枢轴点。每个“三角形”必须以 60 度增量旋转 (.pi
/3)。
import SceneKit
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let sceneView = self.view as! SCNView
let scene = SCNScene()
sceneView.scene = scene
sceneView.allowsCameraControl = true
sceneView.backgroundColor = NSColor.white
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
scene.rootNode.addChildNode(cameraNode)
cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
for i in 1...6 {
let triangleNode = SCNNode(geometry: SCNPyramid(width: 1.15,
height: 1,
length: 1))
// the depth of the pyramid is almost zero
triangleNode.scale = SCNVector3(5, 5, 0.001)
// move a pivot point from pyramid its base to upper vertex
triangleNode.simdPivot.columns.3.y = 1
triangleNode.geometry?.firstMaterial?.diffuse.contents = NSColor(
calibratedHue: CGFloat(i)/6,
saturation: 1.0,
brightness: 1.0,
alpha: 1.0)
triangleNode.rotation = SCNVector4(0, 0, 1,
-CGFloat.pi/3 * CGFloat(i))
scene.rootNode.addChildNode(triangleNode)
}
}
}
在这个项目中,我在 MeshDescriptor 的帮助下生成了一个三角形,并将其复制了 5 次。
import UIKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
let anchor = AnchorEntity()
let camera = PointOfView()
let indices: [UInt32] = [0, 1, 2]
override func viewDidLoad() {
super.viewDidLoad()
self.arView.environment.background = .color(.black)
self.arView.cameraMode = .nonAR
self.camera.position.z = 9
let positions: [simd_float3] = [[ 0.00, 0.00, 0.00],
[ 0.52, 0.90, 0.00],
[-0.52, 0.90, 0.00]]
var descriptor = MeshDescriptor(name: "Hexagon's side")
descriptor.materials = .perFace(self.indices)
descriptor.primitives = .triangles(self.indices)
descriptor.positions = MeshBuffers.Positions(positions[0...2])
var material = UnlitMaterial()
let mesh: MeshResource = try! .generate(from: [descriptor])
let colors: [UIColor] = [.systemRed, .systemGreen, .yellow,
.systemTeal, .cyan, .magenta]
for i in 0...5 {
material.color = .init(tint: colors[i], texture: nil)
let triangleModel = ModelEntity(mesh: mesh,
materials: [material])
let trianglePivot = Entity() // made to control pivot point
trianglePivot.addChild(triangleModel)
trianglePivot.orientation = simd_quatf(angle: -.pi/3 * Float(i),
axis: [0,0,1])
self.anchor.addChild(trianglePivot)
}
self.anchor.addChild(self.camera)
self.arView.scene.anchors.append(self.anchor)
}
}
关于ios - 如何用 6 个三角形 SCNNode 制作六边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60484787/
我的场景中有一系列(平面)节点,我需要它们始终面向相机。 如何调整变换/旋转以使其正常工作? 另外,我在哪里进行计算? 目前我正在尝试在 SCNSceneRendererDelegate render
我正在构建一个应用程序,它使用 Scenekit 根据从数据库返回的信息显示场景。我创建了一个带有类 func 的自定义类,它创建了一个包含所有需要绘制的 SCNNode 并将其返回到我的 SCNVi
我想从动画 SCNNode 获取当前节点位置我知道 presentationNode 并且我尝试从那里提取位置形式,但没有运气 这是我的代码 SCNNode * pelvis = [_unit chi
我正在使用 Swift 和 ARKit。我可以使用 ARSCNFaceGeometry、ARFaceTrackingConfiguration 等成功显示和更新面部网格。头部没有移动(它看起来向用户)
我有一个适用于 iOS 的 sceneKit 应用程序。我有一个连接到 SCNNode 的 SCNPhysicsBody。我将 .physicsBody 设置为 nil,对 SCNNode 进行一些更
我有一个 SCNNode 的子类“ExSCNNode”,用于向 SCNNode 添加更多属性和行为。 class ExSCNNode : SCNNode { ... } 我用 ExSCNNode 构建
我正在尝试将 SCNLight 添加到 SceneKit 中的 SCNSphere (SCNNode)。它的效果令人惊叹,唯一的问题是 SCNLight 所连接的源球体是完全黑色的,因为作为源,它根本
因此,我能够在 anchor 位置放置一个框节点。现在,如何旋转场景中的 SCNNode? 我正在尝试修改节点的变换和 eulerAngles,但它们没有任何效果: func renderer(_ r
有人知道如何将 SCNMaterial 转换为表面而不改变 SCNMaterial 包含图像的方向吗? 我想创建包含图像的 ARKit SCNNode,然后将其转换为表面,因为我想在所选位置的表面区域
我正在研究 ARKit 和图像检测。现在我有一个应用程序可以检测图像并将平面放置在屏幕上检测到的对象所在的位置。 我怎样才能在飞机上添加一个像按钮一样的可点击元素。我想在每个检测到的对象上都有一个点击
我正在通过编写一个游戏来学习 SceneKit,在这个游戏中你飞过小行星场躲避物体。最初,我通过移动/旋转相机来做到这一点,但我意识到在某些时候我会用完坐标空间,最好将所有对象移向相机(并在我完成后处
我正在处理枢轴和位置已更改的子节点。我发现了很多SCNNode转换主题,但似乎没有一个能代表我的情况。 我有六个球:(不能发布超过 2 个链接,图片位于 i.stack.imgur.com/v3Lc4
我正在使用 Apple 的 SceneKit 并拥有自定义 .dae 资源。我已将资源转换为 .scn 文件。我正在从 .scn 文件中按名称获取 SCNNode。将 SCNNode 作为子节点放置在
我有以下情况。一个 SCNView,其中显示了一座桥的 .scn。在屏幕的左侧,您可以看到桥梁的视觉表示。 我想做以下事情。 在“模型浏览器”左侧选择一项 缩放到所选项目并聚焦 在提供的屏幕截图上。你
我在 SwiftUI 框架内的“SCNView”中有一个“SCNCylinder”。我的目标是围绕不同的轴并以不同的角度旋转圆柱体。我有两个(某种意义上的)按钮,它们接受用户的 180° 或 90°
我试图通过将其枢轴点设置为任何角来旋转 block ,但似乎设置枢轴点实际上重新定位了节点,使该点保持在原来的位置...... 例如 SCNBox *box = [SCNBox boxWithWidt
假设我有 2 个 SCNNodes node1 和 node2。 我希望 node1 的位置为 node1.position = SCNVector3(0, 0, 0) 我希望 node2 的位置为
我正在使用下面的代码创建一个盒子放置在我的 AR 场景中: let box = SCNBox(width: side, height: side, length: side, chamferRadiu
问题: 我试图让一个节点看着手机,无论手机的方向如何,节点的顶部始终指向手机的北极。假设节点位于中心,手机从 (0, 0, 10) 开始,并假设节点具有类似于手机的矩形几何形状。我希望该矩形的顶部始终
我有一个 scnnode,我使用 UIPanGestureRecognizer 围绕它的 Y 轴旋转。这很好,但我想对化身应用惯性,以便在用户抬起手指后它会一直旋转(并减速),有点像 ScrollVi
我是一名优秀的程序员,十分优秀!