[3D算法] 调试方案(画3D图形) - 基于MaxScript在3ds Max画出图形(用C++拼出MaxScript的代码)
程序员文章站
2022-07-12 18:38:57
...
引言
最近博主在从事3D算法的研发,遇到一个比较棘手的问题:如何便捷的查看3D算法的中间结果。
比如我想要看两个空间三角形是否相交,但中间结果无非是一堆数字而已,要想办法给它绘制出来。
编程确实能够解决问题,但3D绘制引擎,难免过于笨重。自己构造obj也是可以,但也过于麻烦。
在调研3D建模软件时,同事告知3dmax有一个脚本语言Maxscript。查看其示例时,发现它的语法特别方便。于是,把这种调试方案分享给大家,如果有其他调试方式,请阁下不吝赐教。
例子:用MaxScript在3ds Max中绘制一条线
ss=SplineShape () --创建一个spline并赋值给ss。此时线条是空的,什么都没有
addNewSpline ss --在ss中创建一条线,此时线条是空的,没有点
addKnot ss 1 #corner #line [0,0,0] --添加点
--1表示ss的第一个spline
--#corner表示角点,有#smooth | #corner | #bezier | #bezierCorner可供选择
--#line表直线,有#curve | #line供选择
addKnot ss 1 #corner #line [100,0,0]
updateshape ss --更新线条
调试方案
于是有了以下策略:
【解决方案】
在C++新计算出一对空间三角形时,将他们拼接成maxscirpt的语句,输出到日志。
如果想查看哪些数据,直接在日志中复制maxscript的代码,在3dmax中运行即可。
示例:绘制一个3D线
(1)C++中拼接出MaxScript的语句
std::string Geometry3D::lineToMaxScript(double x1, double y1, double z1,
double x2, double y2, double z2,
std::string var_name /*= "line"*/)
{
std::string script = "\n";
script += var_name + " = SplineShape()\n";
script += "addNewSpline " + var_name+"\n"; //添加一条线
script += "addKnot " + var_name + " 1 #corner #line[" + std::to_string(x1) + ", " + std::to_string(y1) + ", " + std::to_string(z1) + "]\n";
script += "addKnot " + var_name + " 1 #corner #line[" + std::to_string(x2) + ", " + std::to_string(y2) + ", " + std::to_string(z2) + "]\n";
script += "updateshape " + var_name + "\n"; //更新
return script;
}
(2)将结果输出到系统的日志中
LogUtil.Trace("- intersection line - %s", Geometry3D::lineToMaxScript(line_start, line_end).c_str());
日志中打印的效果:
line69 = SplineShape()
addNewSpline line69
addKnot line69 1 #corner #line[-1900.317627, -840.096091, 285.078657]
addKnot line69 1 #corner #line[-1899.095522, -839.386864, 285.078088]
updateshape line69
(3) 在3DMax中运行脚本
如果想查看哪些3D数据,直接在日志中复制出Maxscript的代码,在3dmax中运行。
如此,即可在3dmax中看到你想绘制的3D图形了。
总结
MaxScript语法挺简便的,看了几个示例就可以编写了。如果你也遇到同样的问题,可以用你使用的编程语言试试吧!
目前,我已经把算法中所有的输出数字都组织成了MaxScript代码了,想要看哪些数据,复制到3dmax即可,非常方便。
上一篇: java volatile and transient
下一篇: Restful Web Guide