エッジがモデルに表示されるのはなぜですか?

可視エッジは、通常 3ds Max では表示されない隠線のことです。この問題は、Revit モデルで特に発生しやすく、Revit から書き出されるすべてが三角形化されることが原因です。これによって、3ds Max で通常は非表示のエッジが表示されることになります。

注: この可視エッジの問題は、バージョン 2010 以前の Revit から書き出す場合に生じます。この問題は Revit 2011 で解決されたので、それ以降のバージョンではオブジェクトはエッジが非表示のまま書き出されます。

可視エッジとは

可視エッジが見えてしまうのは、たとえば、3ds Max では壁の 4 辺である 4 つのエッジだけが表示されるべき壁が Revit のシーンにあるような場合です。代わりに、3ds Max では両方のコーナーの頂点を接続する中間に三角形が表示されます。この中間の三角形は、通常は非表示です。

このスクリプトを使用すると、読み込まれたモデルの不要なエッジをすべて非表示にすることができます。特に FBX を使って 3ds Max に読み込まれた Revit 2010 以前のモデルなどで有効です。次のスクリプトは、すべてのエッジを読み込んで、隣接するエッジの隣にあるかどうかを評価して非表示にできるエッジを決定します。不要なエッジを非表示にすると、モデルは見やすくなります。

このスクリプトを使用するには

  1. シーン内のすべてのオブジェクトを選択します。
  2. 3ds Max メイン メニューで[MAXScript] [新規スクリプト](New Script)を選択します。
  3. 次のスクリプトをコピーしてダイアログ ボックスに貼り付けます。
  4. [Ctrl]+[E]を押してすべてを評価(Evaluate All)し、スクリプトを実行します。

このスクリプトを保存して、オブジェクトを選択した状態で、3ds Max のビューポートに .ms ファイルにドラッグ アンド ドロップすることもできます。

注: このスクリプトは編集可能メッシュに対してのみ効果があり、編集可能ポリゴン、パッチ、その他のエンティティは無視します。
(
	-- do this in a local scope so I don't pollute the global scope.
	function setVisibilityEdges obj =
	(
		local edgeSelSet = #()
		-- Go through all faces
		local numFaces = obj.numfaces
		for faceIndex = 1 to numFaces do
		(	
			-- And for every one of the 3 edges
			for edgeIndex = 1 to 3 do 
			(
				--collect the edge
				append edgeSelSet ( ((faceIndex-1)*3) + edgeIndex )
			)
		)
		-- Select all visible edges
		meshop.autoedge obj edgeSelSet 5 type:#setclear 
	)
	--==============================================
	-- Start of the runtime script
	--==============================================
	local timestart = timestamp()
	-- turn off undo during this operation.
	with undo off
	(
		local editMeshArray = #()
		for obj in Selection do
		(
			if (classof obj == Editable_Mesh) do
			(
				-- collect all the edit meshes first, because the
				-- user could have selected some helper objects too, which we
				-- don't want to process.
				append editMeshArray obj
			)
		)
		-- we don't need to hold the selection anymore, clear it out.
		clearselection()
				-- Array of object handles that have already had their edges hidden
		local allReadyProcessed = #()
		-- iterate through all selected edit meshes...
		for editMeshobj in editMeshArray do
		(
			local found = (FindItem allReadyProcessed editMeshobj.handle) > 0
			if (not found) then
			(
				setVisibilityEdges editMeshobj
				append allReadyProcessed editMeshobj.handle				-- Mark all the instances as processed too!
				InstanceMgr.GetInstances editMeshobj &repeatArray
				if (repeatArray.count > 0) then
				(
					-- mark them as processed by adding their handle to the array
					for repeat in repeatArray do
					(
						append allReadyProcessed repeat.handle
					)
				)
			)
		)
	)
	redrawviews()
	local timeend = timestamp()
	format "Total time: % (seconds)\n" ((timeend - timestart)/1000.0))