[3D算法] 调试方案(画3D图形) - 基于MaxScript在3ds Max画出图形(用C++拼出MaxScript的代码)

引言

最近博主在从事3D算法的研发,遇到一个比较棘手的问题:如何便捷的查看3D算法的中间结果。
比如我想要看两个空间三角形是否相交,但中间结果无非是一堆数字而已,要想办法给它绘制出来。

编程确实能够解决问题,但3D绘制引擎,难免过于笨重。自己构造obj也是可以,但也过于麻烦。

在调研3D建模软件时,同事告知3dsMax有一个脚本语言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++算法中,将新计算的中间结果拼成MaxScript的语句,并输出到日志
如果想查看哪些数据,直接从日志中复制MaxScript的代码,在3ds Max中运行即可。

示例:绘制一个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中运行脚本
直接从日志中复制出数据的Maxscript的代码,在3dmax中运行。
[3D算法] 调试方案(画3D图形) - 基于MaxScript在3ds Max画出图形(用C++拼出MaxScript的代码)_第1张图片
[3D算法] 调试方案(画3D图形) - 基于MaxScript在3ds Max画出图形(用C++拼出MaxScript的代码)_第2张图片
如此,即可在3dmax中看到你想绘制的3D图形了。
[3D算法] 调试方案(画3D图形) - 基于MaxScript在3ds Max画出图形(用C++拼出MaxScript的代码)_第3张图片

总结

MaxScript语法挺简便的,看了几个示例就可以编写了。如果你也遇到同样的问题,可以用你使用的编程语言试试吧!
目前,我已经把算法中所有的输出数字都组织成了MaxScript代码了,想要看哪些数据,复制到3dmax即可,非常方便。

PS:博主的上一个解决方案是把数据拼接成C++的代码,复制到公司自主的GIS平台中运行,每次需要:复制、粘贴、编译、运行、打开工作空间、执行命令。。。

你可能感兴趣的:(#,3DMath,3dmax,绘制3D图形,C++,3D算法调试)