欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[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中运行。
[3D算法] 调试方案(画3D图形) - 基于MaxScript在3ds Max画出图形(用C++拼出MaxScript的代码)
[3D算法] 调试方案(画3D图形) - 基于MaxScript在3ds Max画出图形(用C++拼出MaxScript的代码)
如此,即可在3dmax中看到你想绘制的3D图形了。

总结

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