MCG積み上げグラフ

Max Creation Graphで積み上げグラフ(Stacked Bar Chart)の作成。

入力できるデータは5つまでのなんとも融通の利かないものになってしまっています。「Parameter: IArray<Single>」を用いて可変長の配列を入力出来ますがそれだとアニメーションができなくなってしまうので不採用。

半年ほど前に作成したので中身を今見返すとなんのこっちゃな状態。

あらかじめ用意されているオペレータノードが豊富でどれを使用するか、または希望の機能を持つノードがあるのかを把握するだけでも結構大変ですね。

パッケージしていない状態ですので改変はご自由に。Max2016 Extention2 SP3 v2 で動作確認済み。htS5BChart.zip


Random space filling

空間を充填するつーのはすごく難しい問題らしい。

球体で埋める場合は「アポロニウスのギャスケット」というものを使えば出来そうですけど、それ以外はランダムに位置を決めてみて、重なってれば「偽」、はまれば「真」と、繰り返していくしかなさそうです。

で、これが、

続きを読む “Random space filling”


Modo901

Modo901へアップグレード!

MeshFusionが標準で付く他は小粒な機能追加のみのようですが、MODO’s TD SDKというPython APIが追加されたのは僕にとっては大きいところです。今までもPythonを使用することはできました、lxモジュールというPythonとModoマクロ言語の橋渡しのようなAPIを介して使用する方法です(あまり覚える気が無かったのでこの表現が正しいかはわかりません。)

バージョン901からmodoモジュールが追加され、Mayaで言うPymelのような使い勝手が期待できます。

modo901ScriptEditor

内臓のスクリプトエディタを少し使ってみましたが、オートインデントが効きません。「:(コロン)」の次の改行はインデントされるのですがそれ以外では不可、Pythonを書くのにこれは不便ですね。


V-Ray Physical Camera’s Fov

Focal lengthで画角を指定したV-Ray Physical Cameraからfovを取得するテストスクリプト。

VRayCameraFOV

Mayaのカメラなら以下のようにfilmWidthとfocalLengthから計算できますが、MaxのV-Ray Cameraでは被写体までの距離が必要です。

def angleOfView(filmWidth,focalLength):
    angle = 2 * math.atan(float(filmWidth) / (2*float(focalLength)))
    angle = math.degrees(angle)
    return angle

Angle of viewの「Derivation of the angle-of-view formula」が参考になります。

import MaxPlus
import math
 
def angleOfView(filmWidth,focalLength):
    angle = 2 * math.atan(float(filmWidth) / (2*float(focalLength)))
    angle = math.degrees(angle)
    return angle
 
def angleOfViewVrayCamera(filmWidth,focalLength,distance):
	focalLengthWithMagFactor = distance * focalLength / (distance - focalLength)
	angle = angleOfView(filmWidth,focalLengthWithMagFactor)
	return angle
 
def getVRayCameraFocusDistance(node):
	objPBlock = node.Object.ParameterBlock
	distance = 0.0
	if objPBlock.targeted.Value and (not objPBlock.specify_focus.Value):
		targetNode = node.GetTarget()
		vec = targetNode.GetWorldPosition() - node.GetWorldPosition()
		distance = vec.GetLength()
	elif (not objPBlock.targeted.Value) and (not objPBlock.specify_focus.Value):
		distance = objPBlock.target_distance.Value
	elif (not objPBlock.targeted.Value) and objPBlock.specify_focus.Value:
		distance = objPBlock.focus_distance.Value
	return distance
 
def getVRayCameraFOV(node):
	objPBlock = node.Object.ParameterBlock
	fov = 0.0
	if objPBlock.specify_fov.Value == True:
		fov = objPBlock.fov.Value
	else:
		fov = angleOfViewVrayCamera(
			objPBlock.film_width.Value,
			objPBlock.focal_length.Value,
			getVRayCameraFocusDistance(node))
	return fov
	
if __name__ == '__main__':
	if MaxPlus.SelectionManager.GetCount() != 0:
		selNode = MaxPlus.SelectionManager.GetNode(0)
		if selNode.Object.GetClassName() == 'VRayPhysicalCamera':
			print getVRayCameraFOV(selNode)
		else:
			print "Selection is not V-Ray Camera."
	else:
		print "Select V-Ray Camera."

はじめてPythonAPIを使ってみました、Maxの中にPythonエディタが搭載されてるわけでは無いんですね。APIリファレンスの情報量も少ないなー。