我有两个向量u和v.有没有办法找到一个四元数来表示从u到v的旋转?
我一直在尝试使用SceneKit在球体外边缘的两个点之间绘制一个圆柱体.我已经使用原始几何和带有SCNRendering委托的openGL在这两个点之间产生了一条线,但现在我需要在这两个点之间产生一个圆柱体(好吧,不仅仅是两个,而是任何两个位于球体表面的三维矢量) ).我已经连续工作了大约3天了,我已经完成了实现四元数以实现这一切的所有内容,但就目前而言,我无法让它发挥作用.学术文章,科学研究,什么都没有,没有什么工作在两个固定点之间重新调整圆柱体.我需要一个算法来做到这一点.
无论如何,这是我最近的代码不起作用,但这只是我迄今为止所做的近2k行代码的一小段代码,没有预期的结果.我知道我可以转向更先进的东西,比如构建我自己的SCNProgram和/或SCNRenderer然后访问GLSL,OpenGL和Metal复杂性,但这看起来像是应该可以使用Scenekit并在GLKit向量结构与SCNVector之间进行转换结构,但到目前为止,这是不可能的:
码:
以下代码摄取经度和纬度坐标并将它们投影到3D球体的表面上.这些坐标是通过我构建的专有函数返回的,其中我收到了{x,y,z}坐标的SCNVector3,它在我的3D球体上准确显示.我在两组经度和纬度坐标之间绘制一条线,其中使用基元绘制的线穿过球体的中心.因此,正如我上面提到的,我想要相同的功能,但是使用圆柱体,而不是线条(顺便说一句,这里列出的经度和纬度坐标是虚假的,它们是随机生成的,但都落在地球表面).
drawLine = [self lat1:37.76830 lon1:-30.40096 height1:tall lat2:3.97620 lon2:63.73095 height2:tall];
float cylHeight = GLKVector3Distance(SCNVector3ToGLKVector3(cooridnateSetOne.position), SCNVector3ToGLKVector3(coordinateSetTwo.position));
SCNCylinder * cylTest = [SCNCylinder cylinderWithRadius:0.2 height:cylHeight];
SCNNode * test = [SCNNode nodeWithGeometry:cylTest];
SCNMaterial *material = [SCNMaterial material];
[[material diffuse] setContents:[SKColor whiteColor]];
material.diffuse.intensity = 60;
material.emission.contents = [SKColor whiteColor];
material.lightingModelName = SCNLightingModelConstant;
[cylTest setMaterials:@[material]];
GLKVector3 u = SCNVector3ToGLKVector3(cooridnateSetOne.position);
GLKVector3 v = SCNVector3ToGLKVector3(cooridnateSetTwo.position);
GLKVector3 w = GLKVector3CrossProduct(u, v);
GLKQuaternion q = GLKQuaternionMakeWithAngleAndVector3Axis(GLKVector3DotProduct(u,v), GLKVector3Normalize(w));
q.w += GLKQuaternionLength(q);
q = GLKQuaternionNormalize(q);
SCNVector4 final = …Run Code Online (Sandbox Code Playgroud) 我有这样的功能:
func getdrawnHorLineFrom(pos1: SCNVector3, toPos2: SCNVector3) -> SCNNode {
let obj1 = SCNVector3(x: toPos2.x, y: toPos2.y, z:pos1.z)
let line = lineFrom(vector: pos1, toVector: obj1)
let lineInBetween1 = SCNNode(geometry: line)
glLineWidth(15)
return lineInBetween1
}
Run Code Online (Sandbox Code Playgroud)
还:
func lineFrom(vector vector1: SCNVector3, toVector vector2: SCNVector3) -> SCNGeometry {
let indices: [Int32] = [0, 1]
let source = SCNGeometrySource(vertices: [vector1, vector2])
let element = SCNGeometryElement(indices: indices, primitiveType: .line)
return SCNGeometry(sources: [source], elements: [element])
}
Run Code Online (Sandbox Code Playgroud)
基本上,我试图在两个 SCNVector3 类型的 3D 点之间画一条线。绘制的线是一个带有primitiveType 'line' 的'SCNGeometry'。
现在,我想增加我的线条粗细,使其看起来清晰。另外,我想知道,如果有任何办法,我可以让我的线条显示为“虚线”。我为了增加线条的粗细尝试使用 'glLineWidth() 等,但没有成功。
如果有人可以帮助我,我会很高兴。 …
这里最近的一个问题让我再次想到了SceneKit,我想起了一个我从未解决过的问题.
我的应用程序使用SK显示天线设计.大多数天线使用金属杆和网状反射器,因此我使用SCNCylinder作为杆,SCNPlane作为反射器,SCNFloor作为地面.整个事情花了几个小时,我完全是3D的菜鸟.
但有些天线使用的是弯曲成弧形或螺旋形的导线,我在这里进行了踩踏,并使用几个圆柱体端对端制作了蹩脚的分段物体.它看起来很奇怪.
理想情况下,我想要一个单独的对象,使圆弧或螺旋呈现圆柱形横截面.基本上是SCNTorus,但具有开始和结束角度. 这篇文章讨论了在SK中使用UIBezierPath,但它用于extrude生成类似带状的形状.有没有办法做类似但具有圆柱横截面(如部分SCNTorus)?
我知道我可以通过创建顶点(和法线等)来制作自定义形状,但我希望我错过了一个更简单的解决方案.
一如既往,我需要您的帮助。我需要从起始值(称为SCNVector3)绘制一条直线,并将其连接到现实世界中的位置,直到终点。
有人可以用几行代码向我解释我该怎么做?谢谢!
ios ×3
swift ×3
arkit ×2
scenekit ×2
3d ×1
math ×1
objective-c ×1
opengl-es ×1
quaternions ×1
vector ×1