- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目前我正在为我的公司编写一个插件,我们希望将网格上的一些数学运算转移到 C# 中以提高计算速度。我不仅是 C# 初学者(我是 Python/Maxscript 专家),而且我也很难为 3DS Max 找到好的 SDK 文档。
我当前的问题:获取网格中顶点的世界相对位置。听起来很简单,但它给我带来了一些问题。我可以使用以下方法获取垂直位置:
IPoint3 x = mesh.GetVert(vertID);
对于位于场景 [0,0,0] 中的顶点 3,它返回一个 Point3 值 [-23,86499, 17,5783, 0],可能相对于......好吧,中心我认为的对象。或者一些局部变换矩阵。我想要得到的是顶点在世界空间中的位置,在本例中我知道它是 [0,0,0],并且我可以使用 MaxScript 探测它:
polyOp.getVert $ 3
我用来探索的简单函数是:
List<IINode> nodes = nodesFromHandles(objHandles);
foreach (IINode i in nodes)
{
log(i.Name);
IObjectState iState = i.EvalWorldState(0, true);
IObject iObj = iState.Obj;
IPolyObject iPoly = (IPolyObject)iObj.ConvertToType(0, global.PolyObjectClassID);
ITriObject iTri = (ITriObject)iObj.ConvertToType(0, global.TriObjectClassID);
IMesh mesh = iTri.Mesh;
for (int vertID = 0; vertID < mesh.NumVerts; vertID++)
{
IPoint3 x = mesh.GetVert(vertID); /// RETURNS A BAD POSITION? RELATIVE TO WHAT MATRIX?
log(vertID.ToString() + ": " + x.X.ToString() + ", " + x.Y.ToString() + ", " + x.Z.ToString());
}
}
我想我可能应该对对象变换矩阵做一些事情,但我对此一无所知。工作于:3ds Max 2014、MS visual Studio Community 2015 (C#)、Win7x64,使用 Autodesk.Max.DLL。感谢您提供的所有帮助,在此先感谢您!
编辑:(解决方案?)如果我错了请纠正我,但是通过做一些邪恶的仪式并牺牲我的一些 dentry ,我想出了这个东西。我本质上是在给定时间(设置为第 0 帧,因为为什么不呢?)获取对象世界变换矩阵,然后进行点变换。目前似乎工作得很好,但我需要做更多的测试。
List<IINode> nodes = nodesFromHandles(objHandles);
foreach (IINode i in nodes)
{
log(i.Name);
IObjectState iState = i.EvalWorldState(0, true);
IObject iObj = iState.Obj;
ITriObject iTri = (ITriObject)iObj.ConvertToType(0, global.TriObjectClassID);
IMesh mesh = iTri.Mesh;
/// OBJECT TRANSFORM MATRIX
IInterval iTimeRange = i.GetTimeRange(0);
IMatrix3 worldTm = i.GetObjTMAfterWSM(0, iTimeRange);
for (int vertID = 0; vertID < mesh.NumVerts; vertID++)
{
IPoint3 x = mesh.GetVert(vertID); /// RETURNS A BAD POSITION? RELATIVE TO WHAT MATRIX?
IPoint3 v = worldTm.PointTransform(x);
log(vertID.ToString() + ": " + v.X.ToString() + ", " + v.Y.ToString() + ", " + v.Z.ToString());
}
}
如果有人可以验证或改进这一点 - 欢迎。 :)
最佳答案
为您的答案添加一些解释。下面一行:
IPoint3 vertObjectSpace = mesh.GetVert(vertID);
返回对象空间中的顶点位置,遗憾的是文档中没有提及。由于您对 world 空间中的位置感兴趣,因此必须使用以下方法转换它们:
IMatrix3 tmObj2World= i.GetObjectTM(0, iTimeRange); // where i is your IINode
IPoint3 vertWorldSpace = tmObj2World.PointTransform(vertObjectSpace);
希望对您的理解有所帮助。
一些笔记/进一步阅读:
GetObjectTM
和 GetObjTMAfterWSM
的文档(我猜我更愿意使用 GetObjectTM
,除非您明确必须使用 GetObjTMAfterWSM
): 关于c# - 获取 TriMesh 的世界顶点位置 - 3ds Max SDK C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914062/
我想使用两个适配器,具体取决于路线。目前我有以下商店: if (window.USE_FIXTURES) { var my_adapter = 'DS.FixtureAdapter'; } else
Joomla 3.0 DS 不工作。它已被删除。我明白了 Notice: Use of undefined constant DS - assumed 'DS' in 我该如何解决这个问题? Simi
我正在尝试通过一键单击事件从 2 个不同的表中提取数据。我已经检查了所有内容,似乎没有任何拼写错误或任何其他内容,但不断收到此错误。 下面是我的按钮点击事件的代码 Protected Sub btnF
我希望预先填充定制库组件中的选定值,以便执行编辑功能。我尝试了所有可能的方法,但不知道该组件的任何预定义属性可以帮助我实现这一点。该HTML代码如下所示。。.TS代码。选定ID的JSON数据。Avai
目前我正在学习 x86 汇编,因为我喜欢微 Controller 编程,所以我对汇编很熟悉。 目前我一直在到处寻找这个问题的答案,但似乎找不到它...... DS寄存器,我知道它应该指向我程序中的全局
在 bundle 启动和停止时按什么顺序调用带注释的方法? 我使用aQute.bnd.annotation的注释。 有这方面的文档吗? 我的猜测是: bundle 启动时: 设置A onStartUp
我正在尝试让我之前在 Windows 上编写的一些 Python 代码在我的 DS 上运行。我正在使用 ( DSPython ),当我尝试导入数学时,失败并显示“ImportError: No mod
我对 XML 文件进行数字签名,但需要签名标签包含命名空间前缀“ds”。我在谷歌上进行了大量研究,发现了很多相同的问题,但没有令人满意的答案。 我试图将“ds”手动放入文件中,但签名无效。标签“Sig
本文分享自华为云社区《GaussDB(DWS) 《DWS之TPCD-DS&TPC-H与查询性能的那些事儿》》,作者: 一剑战八荒 。 1 综述 本文目标在于,详细讲述使用GaussDB(DWS)时,如
据我所知,在 DS 上运行的代码必须加载到 RAM 中,从而从已经受到限制的 4M 中获取。有没有办法直接从图像运行 DS 代码? 最佳答案 简短的回答:没有。 Nintendo DS 的内存映射不包
我正在尝试覆盖 DS 以在我的 Windows 开发机器中使用“/”而不是“\”。原因是在某些 javascript 上,它使用 cake 的 DS 进行一些 ajax 调用。 例如: var dat
我只是汇编语言的初学者,可能有一些愚蠢的问题。这两行有什么区别? 3e 8b 06 mov eax,DWORD PTR ds:[esi] 8b 06 mov eax,DWORD PTR [esi
我需要在同一云服务中创建两个 DS 虚拟机。在现有门户中,这非常容易,但是在预览门户中,创建虚拟机时似乎没有设置云服务的选项。 问题是现有门户无法创建 DS 虚拟机或具有高级存储的虚拟机。虽然预览门户
0040103A CALL DWORD PTR DS:[40207A] USER32.MessageBoxA DS: 是什么意思? 最佳答案 该指令正在从内存 ds:
这个问题在这里已经有了答案: Scheduler is not scheduling Pod for DaemonSet in Master node (1 个回答) 关闭 4 年前。 我正在运行一
我反汇编了某些二进制文件(Linux elf)。 我找到了这个代码: movsl %ds:(%esi),%es:(%edi) 有两个寄存器“ds”和“es”。 我知道这些被命名为“段寄存器”。 但是,
我正在研究内核开发。我有一个引导加载程序,可以将二进制文件加载到内存并运行它。二进制文件由C语言生成,构建过程如下: i686-elf-gcc -c main.c -o main.o -std=gnu
考虑这种情况: 在完全基于 OSGi 并大量采用服务层 SOA 概念的网络管理系统中,决定将 NE 管理模块转换为 DS 组件。 在跟踪网络资源的配置子代理角色中有一个 DS 组件,在适当的时候,它会
我需要的是每次当某些消费者需要此服务时 + 使用 CDI 时获取新的服务实例。我已经阅读了很多文章,但找不到 2 个问题的答案。 如果我们使用工厂,为什么在服务消费者中我们调用工厂 ( http://
我在 postgres 和对称 ds 的默认配置中使用对称 ds。 我总是收到以下错误。 2017-12-20 09:59:53,372 INFO [SymmetricLauncher] [Wrap
我是一名优秀的程序员,十分优秀!