2020年06月02日

ビットマップペイントツールのチュートリアルをやってみた その306 3dsmax 2019

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。今回もPythonスクリプトでプログラムを書き換える話の続きだ。

前回に続き3種類のグラデーション「QLinearGradient」「QRadialGradient」「QConicalGradient」について見て行きたい。

2点間のグラデーションの設定については前回の通り「setColorAt()」によってカラーのコントロールポイントを作ることで自由に作りだせる事がわかった。

じゃあその外側はどうなるのかって言うと、次の3つのタイプが用意されている。

PadSpread : 端のカラーをそのまま広げる(デフォルト)

RepeatSpread : 端から端までのパターンを繰り返す

ReflectSpread : 端から端までのパターンを反転させながら繰り返す。「RepeatSpread」のようにつなぎ目が目立たない

下のプログラムは3つのスプレッドを使って線を引いてみたものだ。

from PySide2 import QtWidgets
from PySide2.QtGui import QPainter
from PySide2.QtCore import Qt
from PySide2.QtGui import QImage
from PySide2.QtGui import QPixmap
from PySide2.QtCore import QPoint
from PySide2.QtGui import QPen
from PySide2.QtGui import QBrush
from PySide2.QtGui import QLinearGradient
from PySide2.QtGui import QRadialGradient
from PySide2.QtGui import QConicalGradient
from PySide2.QtGui import QGradient
import MaxPlus

class PyMaxDialog(QtWidgets.QDialog):
  def __init__(self, parent=MaxPlus.GetQMaxMainWindow()):
    super(PyMaxDialog, self).__init__(parent)
    width = 300
    height = 300
    main_layout = QtWidgets.QVBoxLayout()
    image = QImage(width,height,QImage.Format_ARGB32)
    image.fill(Qt.black)
    painter = QPainter()
    painter.begin(image)
    gradient = QLinearGradient(QPoint(100,150),QPoint(190,150))
    gradient.setColorAt(0.0,Qt.red)
    gradient.setColorAt(0.3,Qt.green)
    gradient.setColorAt(0.6,Qt.white)
    gradient.setColorAt(1.0,Qt.blue)
    brush = QBrush(gradient)
    painter.setPen(QPen(brush,50,c=Qt.FlatCap))
    painter.drawPolyline([QPoint(10,60),QPoint(290,60)])
    gradient.setSpread(QGradient.RepeatSpread)
    brush = QBrush(gradient)
    painter.setPen(QPen(brush,50,c=Qt.FlatCap))
    painter.drawPolyline([QPoint(10,150),QPoint(290,150)])
    gradient.setSpread(QGradient.ReflectSpread)
    brush = QBrush(gradient)
    painter.setPen(QPen(brush,50,c=Qt.FlatCap))
    painter.drawPolyline([QPoint(10,240),QPoint(290,240)])
    painter.end()
    label = QtWidgets.QLabel()
    pixmap = QPixmap.fromImage(image)
    label.setPixmap(pixmap)
    main_layout.addWidget(label)
    self.setLayout(main_layout)
    self.resize(width,height)           

def main():
  w = PyMaxDialog()
  w.show()

if __name__ == '__main__':
  main()

下が実行結果。上から「PadSpread」「RepeatSpread」「ReflectSpread」の順だ。

このようにグラデーションの端より外側の色は一定になるか、繰り返すか、反転しながら繰り返すかの3パターンが選べる。

fig 1

続きはまた次回。



take_z_ultima at 11:30|この記事のURLComments(0)3ds Max | CG

2020年06月01日

チャンネルモディファイヤスクリプトについて調べてみた その20 modo14

前回に引き続き「チャンネルモディファイヤ」を作ってみた。

今回は数値の1桁だけを抜き出すものだ。

下がそのコード。

import lx
import lxu.chanmod
 
class NSlice(lxu.chanmod.Operator):
    def initialize(self, desc):
        desc.add ("number", lx.symbol.sTYPE_INTEGER)
        desc.chmod_value (lx.symbol.fCHMOD_INPUT)
        desc.add ("digit", lx.symbol.sTYPE_INTEGER)
        desc.chmod_value (lx.symbol.fCHMOD_INPUT)

        desc.add ("char", lx.symbol.sTYPE_STRING)
        desc.chmod_value (lx.symbol.fCHMOD_OUTPUT)
        desc.add ("int", lx.symbol.sTYPE_INTEGER)
        desc.chmod_value (lx.symbol.fCHMOD_OUTPUT)
 
    def eval(self, chans):
        n = chans.number.GetInt()
        d = chans.digit.GetInt()
        s = str(n)
        l = len(s)
        if d<0 or d>=l:
          chans.char.SetString(' ')
          chans.int.SetInt(0)
        else:
          chans.char.SetString(s[-1-d])
          chans.int.SetInt(int(s[-1-d]))
 
class NSlicePackage(lxu.chanmod.MetaPackage):
    def operator(self):
        return NSlice()
 
lxu.chanmod.bless_server(NSlicePackage, "cmNSlice")

下はこのモディファイヤを使ってみたもの。現在のフレームの1桁目(実際は0桁目)と2桁目(実際は1桁目)を36倍して円柱のX軸の回転角度にして入力することで、

fig1

現在のフレーム数を円柱に描いた数値であらわすような事が出来る。「cmNSlice」の「digit」チャンネルには0、「cmNSlice(2)」の「digiy」チャンネルには1がセットしてある。

fig 2

それではまた次回。



take_z_ultima at 11:30|この記事のURLComments(0)modo | CG

2020年05月29日

ブルーインパルスに感動

見事な編隊飛行の雄姿に感動しました

慌ててカメラを持ち出して撮ってみました

24990_ext_25_0


take_z_ultima at 22:47|この記事のURLComments(0)その他 

2020年05月28日

ビットマップペイントツールのチュートリアルをやってみた その305 3dsmax 2019

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。今回もPythonスクリプトでプログラムを書き換える話の続きだ。

前回の「QBrush」に設定した3種類のグラデーション「QLinearGradient」「QRadialGradient」「QConicalGradient」について見て行きたい。

「QLinearGradient」には以下のようなコンストラクタがある。基本的に2つの2次元座標を指定してその間に直線的に変化するグラデーションを設定するようになっている。

QLinearGradient(QLinearGradient)
QLinearGradient(start, finalStop)
QLinearGradient(xStart, yStart, xFinalStop, yFinalStop)

param xStart
qreal
param finalStop
QPointF
param xFinalStop
qreal
param yFinalStop
qreal
param QLinearGradient
QLinearGradient
param yStart
qreal
param start
QPointF

前回の例では2つの「QPoint」を使って2つの座標を指定して「QLinearGradient(start, finalStop)」のパターンでグラデーションを設定した。

QLinearGradient(QPoint(80,30),QPoint(220,80))

fig 1

グラデーションの色の設定は「setColorAt()」で行う。

PySide2.QtGui.QGradient.setColorAt(pos, color)
Parameters
pos – qreal

color – QColor

「pos」パラメータは0から1の間の数値がとれて、その値はグラデーションの始点を0、終点を1としてマッピングした数直線の位置になる。そして「pos」の示す値の位置が「color」パラメータの色の位置になり、隣の点までの間は点どうしの色のグラデーションになる。つまりグラデーションは始点終点の間にいくつもの色の点を設定して複数色のグラデーションにする事が可能だ。

from PySide2 import QtWidgets
from PySide2.QtGui import QPainter
from PySide2.QtCore import Qt
from PySide2.QtGui import QImage
from PySide2.QtGui import QPixmap
from PySide2.QtCore import QPoint
from PySide2.QtGui import QPen
from PySide2.QtGui import QBrush
from PySide2.QtGui import QLinearGradient
from PySide2.QtGui import QRadialGradient
from PySide2.QtGui import QConicalGradient
import MaxPlus

class PyMaxDialog(QtWidgets.QDialog):
  def __init__(self, parent=MaxPlus.GetQMaxMainWindow()):
    super(PyMaxDialog, self).__init__(parent)
    width = 300
    height = 300
    main_layout = QtWidgets.QVBoxLayout()
    image = QImage(width,height,QImage.Format_ARGB32)
    image.fill(Qt.black)
    painter = QPainter()
    painter.begin(image)
    gradient = QLinearGradient(QPoint(10,150),QPoint(290,150))
    gradient.setColorAt(0.0,Qt.red)
    gradient.setColorAt(0.2,Qt.yellow)
    gradient.setColorAt(0.3,Qt.green)
    gradient.setColorAt(0.6,Qt.white)
    gradient.setColorAt(1.0,Qt.blue)
    brush = QBrush(gradient)
    painter.setPen(QPen(brush,50,c=Qt.FlatCap))
    painter.drawPolyline([QPoint(10,150),QPoint(290,150)])
    painter.end()
    label = QtWidgets.QLabel()
    pixmap = QPixmap.fromImage(image)
    label.setPixmap(pixmap)
    main_layout.addWidget(label)
    self.setLayout(main_layout)
    self.resize(width,height)           

def main():
  w = PyMaxDialog()
  w.show()

if __name__ == '__main__':
  main()

fig 2

それではまた次回。



take_z_ultima at 11:30|この記事のURLComments(0)3ds Max | CG

2020年05月27日

チャンネルモディファイヤスクリプトについて調べてみた その19 modo14

前回に引き続き「チャンネルモディファイヤ」を作ってみた。

今回は文字列の順番を反転するものだ。

下がそのコード。

import lx
import lxu.chanmod
 
class SReverse(lxu.chanmod.Operator):
    def initialize(self, desc):
        desc.add ("text", lx.symbol.sTYPE_STRING)
        desc.chmod_value (lx.symbol.fCHMOD_INPUT)

        desc.add ("output", lx.symbol.sTYPE_STRING)
        desc.chmod_value (lx.symbol.fCHMOD_OUTPUT)
 
    def eval(self, chans):
        st = chans.text.GetString()
        chans.output.SetString(st[::-1])
 
class SReversePackage(lxu.chanmod.MetaPackage):
    def operator(self):
        return SReverse()
 
lxu.chanmod.bless_server(SReversePackage, "cmSReverse")

これが実行結果。入力文字列が反転しているのがわかる。裏から見たのと違うのは1文字ごとは裏返ってない事だ。

fig 1

それではまた次回。



take_z_ultima at 11:30|この記事のURLComments(0)modo | CG
Archives