小编Mat*_*hew的帖子

使用SceneKit在两点之间画一条线

我有两个类型SCNVector3的点(我们称之为pointA和pointB).我想在它们之间画一条线.看起来应该很容易,但找不到办法.

我看到两个选项,都有问题:

使用半径非常小的SCNCylinder,长度为| pointA-pointB | 然后定位/旋转它.

使用自定义SCNGeometry但不确定如何; 或许必须定义两个三角形才能形成一个非常薄的矩形?

似乎应该有一种更简单的方法来做到这一点,但我似乎无法找到一个.

编辑:使用三角形方法给我这个在(0,0,0)和(10,10,10)之间画一条线:

CGFloat delta = 0.1;
SCNVector3 positions[] = {  SCNVector3Make(0,0,0),
    SCNVector3Make(10, 10, 10),
    SCNVector3Make(0+delta, 0+delta, 0+delta),
    SCNVector3Make(10+delta, 10+delta, 10+delta)};
int indicies[] = {
    0,2,1,
    1,2,3
};

SCNGeometrySource *vertexSource = [SCNGeometrySource geometrySourceWithVertices:positions count:4];
NSData *indexData = [NSData dataWithBytes:indicies length:sizeof(indicies)];
SCNGeometryElement *element = [SCNGeometryElement geometryElementWithData:indexData primitiveType:SCNGeometryPrimitiveTypeTriangles primitiveCount:2 bytesPerIndex:sizeof(int)];
SCNGeometry *line = [SCNGeometry geometryWithSources:@[vertexSource] elements:@[element]];

SCNNode *lineNode = [SCNNode nodeWithGeometry:line];
[root addChildNode:lineNode];
Run Code Online (Sandbox Code Playgroud)

但是有一些问题:由于法线,你只能从一边看到这条线!它从另一边看不见.此外,如果"delta"太小,则根本看不到该线.实际上,它在技术上是一个矩形,而不是我想要的线,如果我想绘制多个连接线,可能会导致小的图形故障.

opengl macos cocoa objective-c scenekit

21
推荐指数
5
解决办法
2万
查看次数

如何在Swift中正确初始化UnsafePointer?

我正在尝试使用CTFontCreatePathForGlyph(font: CTFont?, glyph: CGGlyph, transform: CConstPointer<CGAffineTransform>):

let myFont = CTFontCreateWithName("Helvetica", 12, nil)
let myGlyph = CTFontGetGlyphWithName(myFont, "a")
let myTransform = CGAffineTransformIdentity
Run Code Online (Sandbox Code Playgroud)

但是我如何正确传递myTransformCTFontCreatePathForGlyph

我已经尝试创建一个myTransformPointer传递给函数,如下所示:

var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer().initialize(newvalue: myTransform)
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

Playground execution failed: error: <REPL>:20:76: error: '()' is not convertible to 'UnsafePointer<CGAffineTransform>'
var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer().initialize(newvalue: myTransform)
Run Code Online (Sandbox Code Playgroud)

所以我试着明确命名类型:

var myTransformPointer: UnsafePointer<CGAffineTransform> = UnsafePointer<CGAffineTransform>().initialize(newvalue: myTransform)
Run Code Online (Sandbox Code Playgroud)

然后我得到一个不同的错误:

Playground execution failed: error: <REPL>:20:95: error: could not find an overload for 'init' that accepts the …
Run Code Online (Sandbox Code Playgroud)

swift

20
推荐指数
1
解决办法
1万
查看次数

从UnsafePointer <UnsafePointer <CFloat >>到Swift中的浮点数组?

我正在尝试AVAudioPCMBuffer.floatChannelData使用Swift 进行访问,但它的类型 UnsafePointer<UnsafePointer<CFloat>>(在Objective-C中@property(nonatomic, readonly) float *const *floatChannelData),并且我进行任何尝试都会导致执行失败.

在Swift Playground中设置快速AVAudioPCMBuffer的示例代码包含在上一个问题中:

让AVAudioPCMBuffer正常工作(AVAudioFile.mm错误代码-50)

avfoundation swift

9
推荐指数
1
解决办法
3475
查看次数

OS X上的SceneKit包含数千个对象

我正在学习本教程:http://blog.bignerdranch.com/754-scenekit-in-mountain-lion/

我对使用Scene Kit感兴趣,但我的场景可能有数千个球体.要对Scene Kit进行压力测试,我试过这个:

SCNSphere *sphere = [SCNSphere sphereWithRadius:0.5];
for (int i=0; i<10; i++) {
    for(int j=0; j<10; j++){
        for(int k=0; k<10; k++){
            SCNNode *myNode = [SCNNode nodeWithGeometry:sphere];
            myNode.position = SCNVector3Make(i,j,k);
            [root addChildNode:myNode];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于1000球(10 ^ 3),但是对于1,000,000个球(100 ^ 3)而言失败(也许不足为奇).我不介意不能使用一百万个球体,但我想弄清楚明智的上限是什么(5,000?15,000?)以及如何增加它.

我该怎么做才能缓解这种情况?例如,我已经尝试了sphere.segmentCount = 3,虽然这加快了渲染速度,但它对内存使用没有太大影响,我怀疑这是限制因素.

此外,似乎没有SCNPoint类.我在考虑切换到仅在球体数量太高时显示一个点,但我无法从SceneKit文档中看到如何显示一个简单的点 - 我能看到的最简单的是一个三角形.

任何帮助深表感谢.

编辑: @toyos建议将SCNSphere对象合并到单个SCNGeometry对象中(前提是它们不需要独立动画,但它们不需要),但我找不到一种简单的方法来执行此操作.

SCNGeometry是使用此处[SCNGeometry geometryWithSources:(* NSArray)sources geometryWithElements:(* NSArray) elements]记录的创建的,但我不清楚如何从我的领域创建一个对象.SCNGeometry

例如,对于单个球体,我可以看到使用sphere.geometryElementCount获取元素的数量,然后使用它来填充数组,使用[sphere geometryElementAtIndex:(NSInteger)elementIndex]它可以给我元素,但我不知道如何获得"源"(或者它们甚至是什么)是).获取几何源的方法是[sphere geometrySourcesForSemantic:(NSString*) semantic],但这个语义字符串是什么?(它意味着是"法线"还是"顶点"还是其他的东西?文档非常有用地说语义是"几何源的语义值."而没有说出语义的可能值是什么)

这只是一个单一的球体,这将是毫无意义的(因为SCNSphere它只是一个SCNGeometry无论如何的子类),所以现在我必须添加多个球体.那么在将它们添加到我的SCNGeometry对象时,我是否必须手动转换球体的顶点? …

cocoa objective-c scenegraph scenekit

8
推荐指数
1
解决办法
5101
查看次数

matplotlib 的平滑、插值三级或四级色标(例如 r、g、b 三角形)?

假设我想为 matplotlib 图中的点创建一个配色方案,并且每个点都有一定比例的属性ABC(每个属性可以取 0 到 1 之间的值)。一种简单的方法是使用rgb 三角形,以便该点的红色值由 给出A,其绿色值由 给出B,其蓝色值由 给出C

然而,看起来像这样的替代三角形可能会提供更多的“动态范围”,即更容易看到三角形中每个点的位置。但是,我不知道如何对特定的三角形进行编码(即给定A, Band C,返回一个(r,g,b)元组)。它还存在一个额外的问题,即中心有白色,在白色背景下显得不太好。

我的问题:对于这样的问题,什么是好的三角形色标?这种东西叫什么,因为我发现很难搜索?

此外,如果我们想将其扩展到四个属性 、ABCD并有一个“颜色方块”,那么四个角的合适颜色是什么,以及如何编写一个函数从ABCD返回一个(r,g,b)元组?

理想情况下,像这样的配色方案(a)到处都有独特的颜色,(b)其中没有白色,并且(c)理想情况下具有较高的变化,以便更容易地看到您在色标中的位置看着它。更好的是色盲安全的东西,但在这种情况下,这可能要求太多了。

非常感谢您的建议。我的最终目标是制作类似的东西但使用这些配色方案之一。谢谢。

编辑:添加重要的约束A+B+C=1以使这在技术上成为可能。举例来说,假设我想提出一个配色方案,以便将独特的颜色映射到三元相图中的特定成分,如下所示。“明显”的情况是使用 RGB 三角形,但是有更好的解决方案吗?我该如何用 Python 编码呢?

python colors matplotlib color-space

5
推荐指数
1
解决办法
2480
查看次数

将SceneKit场景导出为Collada .dae文件的最简单方法?

我有一个算法生成的SceneKit场景,我希望能够导出为Collada .dae文件,例如用于iBooks Author.由于SceneKit可以导入Collada文件,我认为可能有一种方法可以导出它们,但在API中找不到任何内容.

有没有更简单的方法来编写我自己的导出器,迭代每个节点/几何等?

cocoa objective-c scenekit swift

3
推荐指数
1
解决办法
1306
查看次数

让AVAudioPCMBuffer正常工作(AVAudioFile.mm错误代码-50)

我正在尝试在Swift游乐场(下面的代码)中设置一个基本示例,但也尝试使用Objective-C并获得相同的结果.

import AVFoundation

let fileURL = ... // have tried a wav file and a aiff file
let myAudioFile = AVAudioFile(forReading: fileURL, error: nil)
let myAudioFormat = myAudioFile.fileFormat
let myAudioFrameCount = UInt32(myAudioFile.length)
var myAudioBuffer = AVAudioPCMBuffer(PCMFormat: myAudioFormat, frameCapacity: myAudioFrameCount)
// have also tried a smaller frameCapacity
Run Code Online (Sandbox Code Playgroud)

它到目前为止工作正常,但随后终止于此:

var myError: NSError?
myAudioFile.readIntoBuffer(myAudioBuffer, error:&myError)
Run Code Online (Sandbox Code Playgroud)

我也试过用buffer:myAudioBuffer来命名参数,但这会产生"无关的参数"错误.

最后,我想从缓冲区中获取原始PCM数据作为Swift浮点数组.

objective-c avfoundation swift

2
推荐指数
1
解决办法
2361
查看次数

使用Swift初始化int4; 错误或预期的行为?

游乐场代码:

import simd

let test = int4(1,2,3,4) // this works

let x = 1
let test2 = int4(x,2,3,4) // doesn't work (nor does let x: Int = 1)

let y: Int32 = 1
let test3 = int4(y,2,3,4) // works
Run Code Online (Sandbox Code Playgroud)

很显然,int4期望Int32的值,但在第一种情况下它似乎能推测出来而不显式指定Int的类型,但在第二种情况下(当整数首先被存储作为单独的变量)它没有.

这是Swift的预期行为吗?

simd swift ios9 swift2

1
推荐指数
1
解决办法
167
查看次数