我一直在使用SceneKit尝试在一个球的外边缘的两点之间绘制一个圆柱体。我已经使用基本几何和SCNRendering Delegate中的OpenGL生成了连接这两个点的线,但现在我需要在这两个点之间(不仅仅是两个点,而是任意位于球面上的3D向量)产生一个圆柱体。我已经连续工作了大约三天,浏览了所有有关实现四元数的资料,但目前为止,我无法让它正常工作。学术论文、科学研究,以及其他任何东西都不能让圆柱体在两个固定点之间重新对齐。我需要一种算法来实现这一点。
以下是我的最新代码,虽然它无法正常工作,但这只是我经过近2000行代码的小片段,没有达到预期的结果。我知道我可以采取更高级的方法,比如构建自己的SCNProgram和/或SCNRenderer来访问GLSL、OpenGL和Metal复杂性,但这似乎是可以使用Scenekit并在GLKit向量结构和SCNVector结构之间进行转换的东西,但到目前为止,这是不可能的。
以下代码将经度和纬度坐标投影到3D球面的表面上,并通过我构建的专有函数返回这些坐标的SCNVector3 {x,y,z}坐标,这些坐标在我的3D球上可以准确显示。我在两组经度和纬度坐标之间绘制一条线,使用基本几何绘制的线穿过了球的中心。所以,正如我上面提到的,我希望实现同样的功能,但是用圆柱体代替线(顺便说一下,这里列出的经度和纬度坐标是虚假的,它们是随机生成的,但都位于地球表面上)。
我尝试过其他代码,包括相同的方法。事实上,我甚至在Objective-C中构建了自己的SCNVector3和SCNVector4数学库,以查看我的数学方法是否产生与使用GLKit数学不同的值,但是两种方法都得到了相同的结果。任何帮助都将是很棒的,但现在,我不想涉足比SceneKit更复杂的东西。我会在一个月或两个月后才会深入研究Metal和/或OpenGL。谢谢!
编辑:
变量“cooridnateSetOne”和“cooridnateSetTwo”是由另一个函数产生的SCNNodes,该函数将原始线几何体强制转换为此节点,然后将其返回到SCNScene的子类实现中。
以下是我的最新代码,虽然它无法正常工作,但这只是我经过近2000行代码的小片段,没有达到预期的结果。我知道我可以采取更高级的方法,比如构建自己的SCNProgram和/或SCNRenderer来访问GLSL、OpenGL和Metal复杂性,但这似乎是可以使用Scenekit并在GLKit向量结构和SCNVector结构之间进行转换的东西,但到目前为止,这是不可能的。
以下代码将经度和纬度坐标投影到3D球面的表面上,并通过我构建的专有函数返回这些坐标的SCNVector3 {x,y,z}坐标,这些坐标在我的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 = SCNVector4FromGLKVector4(GLKVector4Make(q.x, q.y, q.z, q.w));
test.orientation = final;
我尝试过其他代码,包括相同的方法。事实上,我甚至在Objective-C中构建了自己的SCNVector3和SCNVector4数学库,以查看我的数学方法是否产生与使用GLKit数学不同的值,但是两种方法都得到了相同的结果。任何帮助都将是很棒的,但现在,我不想涉足比SceneKit更复杂的东西。我会在一个月或两个月后才会深入研究Metal和/或OpenGL。谢谢!
编辑:
变量“cooridnateSetOne”和“cooridnateSetTwo”是由另一个函数产生的SCNNodes,该函数将原始线几何体强制转换为此节点,然后将其返回到SCNScene的子类实现中。
p1Node
和p2Node
是什么? - rmaddy