我在SCNScene中有一個SCNBox
。一旦場景動畫SCNBox
變化是可以通過檢查其presentationNode.orientation
看到的方向。該值在SCNVector4中返回。我如何確定SCNBox
的哪一面是SCNVector4中返回值的正面?從方向獲取SCNNode的「up」端
我曾嘗試以標準化數據,並用以下數據
Side 1 = (-x, 0, 0, +x)
Side 2 = (0, -x, 0 +y)
Side 3 = (-x, +x, -y, y)
Side 4 = (x, x, y, y)
Side 5 = (-x, 0, +y, 0)
Side 6 = (-x, -y, +y, -x)
想出了可惜,這並不總是正確的,並覈對它有時會返回無效雙方偶爾。
是否有一種可靠的方法來確定SCNBox
的幾何方向屬性的正面?
編輯: 基於Toyos的答案,我想出了下面的代碼,這是行不通的。希望這將有助於接近最終目標。我還使用在Extracting vertices from scenekit找到的代碼來獲取我的SCNBoxNode的頂點。
- (NSNumber *)valueForRotation:(SCNVector4)rotation andGeometry:(SCNGeometry*)geometry {
SCNVector4 inverse = SCNVector4Make(rotation.x, rotation.y, rotation.z, -rotation.w);
CATransform3D transform = CATransform3DMakeRotation(inverse.w, inverse.x, inverse.y, inverse.z);
GLKMatrix4 matrix = GLKMatrix4Make(transform.m11, transform.m12, transform.m13, transform.m14, transform.m21, transform.m22, transform.m23, transform.m24, transform.m31, transform.m32, transform.m33, transform.m34, transform.m41, transform.m42, transform.m43, transform.m44);
GLKVector4 vector = GLKVector4Make(rotation.x, rotation.y, rotation.z, rotation.w);
GLKVector4 finalVector = GLKMatrix4MultiplyVector4(matrix, vector);
NSArray *vertexSources = [geometry geometrySourcesForSemantic:SCNGeometrySourceSemanticVertex];
SCNGeometrySource *vertexSource = vertexSources[0]; // TODO: Parse all the sources
NSInteger stride = vertexSource.dataStride; // in bytes
NSInteger offset = vertexSource.dataOffset; // in bytes
NSInteger componentsPerVector = vertexSource.componentsPerVector;
NSInteger bytesPerVector = componentsPerVector * vertexSource.bytesPerComponent;
NSInteger vectorCount = vertexSource.vectorCount;
SCNVector3 vertices[vectorCount]; // A new array for vertices
// for each vector, read the bytes
NSLog(@"vetor count %i",vectorCount);
float highestProduct = 0;
int highestVector = -1;
NSMutableArray *highVectors;
for (NSInteger i=0; i<vectorCount; i++) {
// Assuming that bytes per component is 4 (a float)
// If it was 8 then it would be a double (aka CGFloat)
float vectorData[componentsPerVector];
// The range of bytes for this vector
NSRange byteRange = NSMakeRange(i*stride + offset, // Start at current stride + offset
bytesPerVector); // and read the lenght of one vector
// Read into the vector data buffer
[vertexSource.data getBytes:&vectorData range:byteRange];
// At this point you can read the data from the float array
float x = vectorData[0];
float y = vectorData[1];
float z = vectorData[2];
// ... Maybe even save it as an SCNVector3 for later use ...
vertices[i] = SCNVector3Make(x, y, z);
// ... or just log it
NSLog(@"x:%f, y:%f, z:%f", x, y, z);
float product = (x * finalVector.x) + (y * finalVector.y) + (z * finalVector.z);
if (product > highestProduct) {
highestProduct = product;
highestVector = i;
}
}
NSLog(@"highestProduct = %f",highestProduct);
NSLog(@"highestVector = %i",highestVector);
NSLog(@"top verticy = %f, %f, %f",vertices[highestVector].x,vertices[highestVector].y,vertices[highestVector].z);
return [NSNumber numberWithInt:highestVector];
}
這不起作用,每個邊都返回4。這是我如何創建節點,也許我在這裏做錯了? 'SCNNode * block = [SCNNode node]; block.position = SCNVector3Make(20,0,0); 區塊。rotation = SCNVector4Make(0,0,0,0); block.geometry = [SCNBox boxWithWidth:8 height:8 length:8 chamferRadius:0]; SCNPhysicsBody * body = [SCNPhysicsBody dynamicBody]; body.mass = 5; body.restitution = .7; body.friction = 0.5; block.physicsBody = body; [[scene rootNode] addChildNode:block];' – Jeremy1026
編輯:想出來,我需要改變'boxNode.rotation'爲'boxNode.presentationNode.node'.Thank you so much!我甚至沒有接近我的代碼:( – Jeremy1026