gpt4 book ai didi

cocoa - Scene Kit 的枢轴矩阵的语义是什么?

转载 作者:行者123 更新时间:2023-12-03 16:17:19 25 4
gpt4 key购买 nike

我正在努力理解 Scene Kit 使用节点的变换相关属性的语义。特别是,节点上的枢轴属性不是单个点,而是一个完整的变换矩阵,并且我没有在 Collada 规范或其他文档中找到任何类似内容的引用。

有人有在场景套件中使用枢轴矩阵或具有类似语义的属性的经验吗?有人可以提供如何使用它的简短解释/示例或相关文档的指针吗?它看起来是一种潜在有用的方法,但如果可以避免的话,我宁愿不必对其进行逆向工程。

编辑:根据 OMZ 的响应,看起来枢轴可能只是转换树中的另一层。然而,如果是这样的话,这与仅仅添加一个中间节点有什么不同呢?确定在哪里应用哪些转换的依据是什么?

最佳答案

我尝试了@omz的想法。但有些结果是相互矛盾的,所以我对此进行了更多研究,得到了一些有趣的结果。

答案是主变换的逆被应用作为主变换的子变换。这提供了与提供中间父节点完全不同的语义。

具体来说,如果我从具有变换 P 的父节点和具有变换 C 的子节点开始,它们组合起来形成世界变换 W = CATransform3DConcat(C, P)。通过将父节点的枢轴设置为 C 的逆,而不在子节点上设置变换,可以获得相同的世界变换 W。

这种方法似乎确实提供了一些额外的实用性,因为它不能通过插入中间节点来复制,也不能在应用之前进行反转。正如 Hal Mueller 指出的那样,文档确实说枢轴影响旋转和缩放以及位置,但没有提及影响的本质。

以下是检验该结论的结果:

Set parent rotation and node position.

Transform:
{ 1.00, 0.00, 0.00, 0.00 }
{ 0.00, 1.00, 0.00, 0.00 }
{ 0.00, 0.00, 1.00, 0.00 }
{ 1.00, 2.00, 3.00, 1.00 }

Pivot:
{ 1.00, 0.00, 0.00, 0.00 }
{ 0.00, 1.00, 0.00, 0.00 }
{ 0.00, 0.00, 1.00, 0.00 }
{ 0.00, 0.00, 0.00, 1.00 }

World Transform:
{ 1.00, 0.00, 0.00, 0.00 }
{ 0.00, 0.00, 1.00, 0.00 }
{ 0.00, -1.00, 0.00, 0.00 }
{ 1.00, -3.00, 2.00, 1.00 }
2013-04-04 13:49:55.453 Model Importer[43504:303]

CATransform3DConcat(node.transform, node.parentNode.transform)]
{ 1.00, 0.00, 0.00, 0.00 }
{ 0.00, 0.00, 1.00, 0.00 }
{ 0.00, -1.00, 0.00, 0.00 }
{ 1.00, -3.00, 2.00, 1.00 }
2013-04-04 13:49:55.454 Model Importer[43504:303]

Set parent rotation and parent.pivot to inverse position.

Transform:
{ 1.00, 0.00, 0.00, 0.00 }
{ 0.00, 1.00, 0.00, 0.00 }
{ 0.00, 0.00, 1.00, 0.00 }
{ 0.00, 0.00, 0.00, 1.00 }

Pivot:
{ 1.00, 0.00, 0.00, 0.00 }
{ 0.00, 1.00, 0.00, 0.00 }
{ 0.00, 0.00, 1.00, 0.00 }
{ 0.00, 0.00, 0.00, 1.00 }

World Transform:
{ 1.00, 0.00, 0.00, 0.00 }
{ 0.00, 0.00, 1.00, 0.00 }
{ 0.00, -1.00, 0.00, 0.00 }
{ 1.00, -3.00, 2.00, 1.00 }

代码如下:

    // Verification
SCNVector3 v3 = {1.0, 2.0, 3.0};
SCNVector4 v4 = {1.0, 0, 0, M_PI/2.0};
node.parentNode.rotation = v4;
node.position = v3;
NSLog(@"\n\nSet parent rotation and node position.%@",
[self transformsForNodeToString:node]);
//
// Verify match with CATransform3DConcat
NSLog(@"\n\nCATransform3DConcat(node.transform, node.parentNode.transform)]%@",
[self transformToString:CATransform3DConcat(node.transform, node.parentNode.transform)]);
//
// Clear the child node transform and put the inverse in the parent's pivot.
CATransform3D position = node.transform;
CATransform3D inversePosition = CATransform3DInvert(position);

node.transform = CATransform3DIdentity;
node.parentNode.pivot = inversePosition;
NSLog(@"\n\nSet parent rotation and parent.pivot to inverse position.%@",
[self transformsForNodeToString:node]);
node.parentNode.pivot = CATransform3DIdentity;
node.parentNode.transform = CATransform3DIdentity;


+ (NSString*)transformsForNodeToString: (SCNNode*)node {
NSString* result = @"\n";
result = [result stringByAppendingFormat:
@"\nTransform:%@\nPivot:%@\nWorld Transform:%@",
[self transformToString:node.transform],
[self transformToString:node.pivot],
[self transformToString:[node worldTransform]]];
return result;
}

+ (NSString*)transformToString: (CATransform3D)transform {
NSString* result = @"\n";
result = [result stringByAppendingFormat:
@"{ % .2f, % .2f, % .2f, % .2f }\n", transform.m11, transform.m12, transform.m13, transform.m14];
result = [result stringByAppendingFormat:
@"{ % .2f, % .2f, % .2f, % .2f }\n", transform.m21, transform.m22, transform.m23, transform.m24];
result = [result stringByAppendingFormat:
@"{ % .2f, % .2f, % .2f, % .2f }\n", transform.m31, transform.m32, transform.m33, transform.m34];
result = [result stringByAppendingFormat:
@"{ % .2f, % .2f, % .2f, % .2f }\n", transform.m41, transform.m42, transform.m43, transform.m44];
return result;
}

欢迎评论!

关于cocoa - Scene Kit 的枢轴矩阵的语义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15737320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com