カメラ効果
公開スクリプトの追加方法は、追加方法・留意点の項目を参照して下さい。
また、スクリプトを公開される方は、必ず同ページのスクリプト記載ルールをご確認ください。
このページで紹介されているスクリプトは、断りのない限り『@○○.cam』という名前のファイルに保存し、
script フォルダに配置し使用します。
名称 | 製作者 | 説明 | 出典/最終更新 |
---|---|---|---|
カメラ情報取得 | ゆうき | カメラの座標などのパラメタを表示するためのスクリプト アニメ効果などにカメラ情報を引き渡す用途で使用する |
2011/12/28 |
カメラ情報表示 | ゆうき | カスタムオブジェクト カメラの座標などのパラメタを表示するためのスクリプト カメラ情報取得とセットで使用する 2012/01/08 特定角度で発生する不具合を修正 |
2012/01/08 |
視野角/カメラ距離/目標距離 | ゆうき | 視野角変更よるズーム、カメラ位置変更によるズーム、目標点変更による深度ぼけのコントロールを行うスクリプト カメラ距離を変更した場合は目標点が変更されるため、目標点を変更したくない場合は、目標点を同じ倍率で変動させる必要がある。 なお、視野角と距離を同じ倍率で変動させた場合には、『目標サイズ固定視野角』と同じ効果を発動する。 2012/01/08 『深度ボケ補助』をパワーアップし改名 |
2012/01/08 |
平行移動 | ゆうき | カメラをスクリーン平面に対して平行に移動するためのスクリプト 更新:2012/01/08 特定角度で発生する不具合を修正 |
2012/01/08 |
回転 | ゆうき | カメラをその場で回転させるためのスクリプト 2012/01/08 特定角度で発生する不具合を修正 |
2012/01/08 |
目標中心回転 | ゆうき | カメラを目標点を中心として回転させるためのスクリプト 標準の『目標中心回転』とは異なり、スクリーンに対しての垂直・水平方向に回転する。 |
2012/01/08 |
目標からずれた位置中心回転 | ゆうき | カメラの目標点からずれた位置を中心として回転させるためのスクリプト 例えば、スクリーンの左下を中心に回転するといった具合。(具体例. http://www.nicovideo.jp/watch/sm14971486 の40秒あたりの回転)。 【使い方】まず最終的な回転角をセットする。次に左右ズレ・上下ズレで、回転後の位置を調整する。(左右ズレ・上下ズレは、なぜかななめに動くので、ちょっと使いづらい・・・)。 このカメラ効果は1回使ったら使い捨て的な利用をしないと難しい。例としてあげた動画では、1回のカメラワークで3回ほど回転を使っているが、それを再現する場合、3回この効果を使う必要がある。 |
2012/03/03 |
マニュアルターゲット | ゆうき | 目標オブジェクトへの視線追跡を行うためのスクリプト。 てぃむ氏の『オートターゲット』と似た機能内容だが、こちらは自分でカメラワークをつけることを目的としているため自動カメラワークが貧弱である。 |
2012/01/04 |
--カメラ情報取得
@カメラ情報取得
cam = obj.getoption("camera_param")
--カメラ情報表示
--これはカスタムオブジェクトとして使用するスクリプトです。ファイル名を『@○○.obj』としてください。
@カメラ情報表示
local Q = {
qt = function(axis, degree)
local theta = degree*math.pi/180*0.5
local cos = math.cos(theta)
local sin = math.sin(theta)
local x=axis[1]
local y=axis[2]
local z=axis[3] or 0
local l=math.sqrt(x*x + y*y + z*z)
return {x * sin / l, y * sin / l, z * sin / l, cos}
end,
rotate = function(pos, q)
local x=pos[1]
local y=pos[2]
local z=pos[3] or 0
local qx=q[1]
local qy=q[2]
local qz=q[3]
local qr=q[4]
local x_=qr*x+qy*z-qz*y
local y_=qr*y+qz*x-qx*z
local z_=qr*z+qx*y-qy*x
local r_=-qx*x-qy*y-qz*z
return {-r_*qx+qr*x_-y_*qz+z_*qy, -r_*qy+qr*y_-z_*qx+x_*qz, -r_*qz+qr*z_-x_*qy+y_*qx}
end
}
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
dot = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return x1*x2 + y1*y2 + z1*z2
end,
cross = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return {y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1*x2}
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end,
length = function(v)
local x=v[1]
local y=v[2]
local z=v[3] or 0
return (x*x + y*y + z*z)^0.5
end,
eq = function(lhs, rhs)
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
return
EQ(lhs[1], rhs[1]) and
EQ(lhs[2], rhs[2]) and
EQ(lhs[3], rhs[3])
end
}
local V2 = {
length = function(v)
return math.sqrt(v[1]^2 + v[2]^2)
end,
dot = function(v1, v2)
return v1[1] * v2[1] + v1[2] * v2[2]
end,
cross = function(v1, v2)
return v1[1] * v2[2] - v1[2] * v2[1]
end
}
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
local function get_angle_z(eye_, ue_)
local eye = V.unit(eye_)
local ue = V.cross(eye, V.cross(V.unit(ue_), eye))
local axis = V.cross(eye, {0, 0, 1})
local angle = math.deg(math.acos(V.dot(eye, {0, 0, 1})))
if(not V.eq(axis, {0, 0, 0}))then
ue = Q.rotate(ue, Q.qt(axis, angle))
end
angle = 180 - math.deg(math.atan2(ue[1], ue[2]))
local singular = 0
if(ue[2] > 0)then
singular = 180
end
return angle, singular
end
obj.setfont("MS Gothic", 40, 3, 0xffffff, 0x000000)
if(not cam)then
obj.load("カメラ情報を取得してください")
return
end
local tmp = {}
for k,v in pairs(cam) do
tmp[#tmp + 1] = {k, v}
end
table.sort(tmp, function(lhs, rhs) return lhs[1] < rhs[1] end)
local s = ""
for i,v in ipairs(tmp) do
s = s .. string.format("cam.%s=%.5f
", v[1], v[2])
end
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z} --視線ベクトル
local l = V.length(eye)
s = s .. string.format("視線X=%.5f
", eye[1])
s = s .. string.format("視線Y=%.5f
", eye[2])
s = s .. string.format("視線Z=%.5f
", eye[3])
s = s .. string.format("視線の長さ=%.5f
", l)
local ue = {cam.ux, cam.uy, cam.uz}
local angle_z, singular = get_angle_z(eye, ue)
local angle = (cam.rz - (angle_z + singular) + 360) % 360
s = s .. string.format("傾き=%.5f
", angle)
local angle = math.deg(math.acos(V.dot(ue, V.unit(eye))))
s = s .. string.format("視線と上ベクトルのなす角=%.5f
", angle)
p = math.atan(obj.screen_h/(cam.d*2))*360/math.pi
s = s .. string.format("視野角=%.5f
", p)
obj.load("text", s)
obj.zoom = 0.4
obj.ox = -obj.screen_w / 4
--視野角/カメラ距離/目標距離
@視野角/カメラ距離/目標距離
--track0:視野[+%],-12000,12000,0,0.01
--track1:距離[+%],-12000,12000,0,0.01
--track2:目標[+%],-12000,12000,0,0.01
--track3:目標[+px],-12000,12000,0
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end
}
cam = obj.getoption("camera_param")
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z} --視線ベクトル
local d = cam.d
--視野角変更
local mag = 1 + obj.track0 * 0.01
d = d * mag
d_max = obj.screen_h * 0.5 / math.tan(math.rad(1))
d_min = obj.screen_h * 0.5 / math.tan(math.rad(120))
d = math.max(d_min, math.min(d_max, d))
cam.d = d
--カメラ距離変更
local mag = 1 + obj.track1 * 0.01
local eye__ = V.mul(eye, mag)
cam.x = cam.tx - eye__[1]
cam.y = cam.ty - eye__[2]
cam.z = cam.tz - eye__[3]
--目標点変更
local mag = 1 + obj.track2 * 0.01
local ofs = obj.track3
eye = V.mul(eye, mag)
eye = V.add(eye, V.mul(V.unit(eye), ofs))
cam.tx = eye[1] + cam.x
cam.ty = eye[2] + cam.y
cam.tz = eye[3] + cam.z
obj.setoption("camera_param", cam)
--平行移動
@平行移動
--track0:左右,-20000,20000,0
--track1:上下,-20000,20000,0
--track2:前後,-20000,20000,0
--dialog:傾き基準/chk,use_cameraman_angle=0;視線長さ一定/chk,keep_eye_length=0;
local Q = {
qt = function(axis, degree)
local theta = degree*math.pi/180*0.5
local cos = math.cos(theta)
local sin = math.sin(theta)
local x=axis[1]
local y=axis[2]
local z=axis[3] or 0
local l=math.sqrt(x*x + y*y + z*z)
return {x * sin / l, y * sin / l, z * sin / l, cos}
end,
rotate = function(pos, q)
local x=pos[1]
local y=pos[2]
local z=pos[3] or 0
local qx=q[1]
local qy=q[2]
local qz=q[3]
local qr=q[4]
local x_=qr*x+qy*z-qz*y
local y_=qr*y+qz*x-qx*z
local z_=qr*z+qx*y-qy*x
local r_=-qx*x-qy*y-qz*z
return {-r_*qx+qr*x_-y_*qz+z_*qy, -r_*qy+qr*y_-z_*qx+x_*qz, -r_*qz+qr*z_-x_*qy+y_*qx}
end
}
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
dot = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return x1*x2 + y1*y2 + z1*z2
end,
cross = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return {y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1*x2}
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end,
length = function(v)
local x=v[1]
local y=v[2]
local z=v[3] or 0
return (x*x + y*y + z*z)^0.5
end,
eq = function(lhs, rhs)
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
return
EQ(lhs[1], rhs[1]) and
EQ(lhs[2], rhs[2]) and
EQ(lhs[3], rhs[3])
end
}
local V2 = {
unit = function(v)
local l = math.sqrt(v[1]^2 + v[2]^2)
return {v[1]/l, v[2]/l}
end,
length = function(v)
return math.sqrt(v[1]^2 + v[2]^2)
end,
dot = function(v1, v2)
return v1[1] * v2[1] + v1[2] * v2[2]
end,
cross = function(v1, v2)
return v1[1] * v2[2] - v1[2] * v2[1]
end
}
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
local function get_angle_z(eye_, ue_)
local eye = V.unit(eye_)
local ue = V.cross(eye, V.cross(V.unit(ue_), eye))
local axis = V.cross(eye, {0, 0, 1})
local angle = math.deg(math.acos(V.dot(eye, {0, 0, 1})))
if(not V.eq(axis, {0, 0, 0}))then
ue = Q.rotate(ue, Q.qt(axis, angle))
end
angle = 180 - math.deg(math.atan2(ue[1], ue[2]))
local singular = 0
if(ue[2] > 0)then
singular = 180
end
return angle, singular
end
local offset = {-obj.track0, obj.track1, obj.track2}
cam = obj.getoption("camera_param")
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z} --視線ベクトル
local ue = {cam.ux, cam.uy, cam.uz}
local az = V.unit(eye)
local ax = V.cross(V.unit(ue), az)
local ay = V.cross(az, ax)
local q
--カメラ系の座標軸を求めるS
local q = Q.qt(az, -cam.rz)
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
if(use_cameraman_angle == 1)then
local angle_z, singular = get_angle_z(eye, ue)
q = Q.qt(az, cam.rz - (angle_z + singular))
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
end
--カメラ系の座標軸を求めるE
if(keep_eye_length ~= 1)then
local length = V.length(eye)
eye = V.mul(eye, (length - offset[3]) / length)
end
offset = V.add(V.add(V.mul(V.unit(ax), offset[1]), V.mul(V.unit(ay), offset[2])), V.mul(V.unit(az), offset[3]))
cam.x = cam.x + offset[1]
cam.y = cam.y + offset[2]
cam.z = cam.z + offset[3]
cam.tx = eye[1] + cam.x
cam.ty = eye[2] + cam.y
cam.tz = eye[3] + cam.z
obj.setoption("camera_param", cam)
--回転
@回転
--track0:側方回転,-3600,3600,0,0.01
--track1:水平回転,-3600,3600,0,0.01
--track2:垂直回転,-3600,3600,0,0.01
--dialog:傾き基準/chk,use_cameraman_angle=0;
local Q = {
qt = function(axis, degree)
local theta = degree*math.pi/180*0.5
local cos = math.cos(theta)
local sin = math.sin(theta)
local x=axis[1]
local y=axis[2]
local z=axis[3] or 0
local l=math.sqrt(x*x + y*y + z*z)
return {x * sin / l, y * sin / l, z * sin / l, cos}
end,
rotate = function(pos, q)
local x=pos[1]
local y=pos[2]
local z=pos[3] or 0
local qx=q[1]
local qy=q[2]
local qz=q[3]
local qr=q[4]
local x_=qr*x+qy*z-qz*y
local y_=qr*y+qz*x-qx*z
local z_=qr*z+qx*y-qy*x
local r_=-qx*x-qy*y-qz*z
return {-r_*qx+qr*x_-y_*qz+z_*qy, -r_*qy+qr*y_-z_*qx+x_*qz, -r_*qz+qr*z_-x_*qy+y_*qx}
end
}
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
dot = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return x1*x2 + y1*y2 + z1*z2
end,
cross = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return {y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1*x2}
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end,
length = function(v)
local x=v[1]
local y=v[2]
local z=v[3] or 0
return (x*x + y*y + z*z)^0.5
end,
eq = function(lhs, rhs)
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
return
EQ(lhs[1], rhs[1]) and
EQ(lhs[2], rhs[2]) and
EQ(lhs[3], rhs[3])
end
}
local V2 = {
unit = function(v)
local l = math.sqrt(v[1]^2 + v[2]^2)
return {v[1]/l, v[2]/l}
end,
length = function(v)
return math.sqrt(v[1]^2 + v[2]^2)
end,
dot = function(v1, v2)
return v1[1] * v2[1] + v1[2] * v2[2]
end,
cross = function(v1, v2)
return v1[1] * v2[2] - v1[2] * v2[1]
end
}
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
local function get_angle_z(eye_, ue_)
local eye = V.unit(eye_)
local ue = V.cross(eye, V.cross(V.unit(ue_), eye))
local axis = V.cross(eye, {0, 0, 1})
local angle = math.deg(math.acos(V.dot(eye, {0, 0, 1})))
if(not V.eq(axis, {0, 0, 0}))then
ue = Q.rotate(ue, Q.qt(axis, angle))
end
angle = 180 - math.deg(math.atan2(ue[1], ue[2]))
local singular = 0
if(ue[2] > 0)then
singular = 180
end
return angle, singular
end
local rz = obj.track0
local ry = -obj.track1
local rx = -obj.track2
cam = obj.getoption("camera_param")
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z} --視線ベクトル
local ue = {cam.ux, cam.uy, cam.uz}
local az = V.unit(eye)
local ax = V.cross(V.unit(ue), az)
local ay = V.cross(az, ax)
local q
--カメラ系の座標軸を求めるS
local q = Q.qt(az, -cam.rz)
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
local cam_rz = cam.rz
cam.rz = 0
if(use_cameraman_angle == 1)then
local angle_z, singular = get_angle_z(eye, ue)
q = Q.qt(az, cam_rz - (angle_z + singular))
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
cam.rz = cam_rz - (angle_z + singular)
end
--カメラ系の座標軸を求めるE
q = Q.qt(eye, rz)
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
q = Q.qt(ay, ry)
ax = Q.rotate(ax, q)
eye = Q.rotate(eye, q)
q = Q.qt(ax, rx)
ay = Q.rotate(ay, q)
eye = Q.rotate(eye, q)
--傾き合わせ
if(use_cameraman_angle == 1)then
ay = Q.rotate(ay, Q.qt(eye, -cam.rz))
cam.rz = 0
end
cam.tx = eye[1] + cam.x
cam.ty = eye[2] + cam.y
cam.tz = eye[3] + cam.z
cam.ux = ay[1]
cam.uy = ay[2]
cam.uz = ay[3]
obj.setoption("camera_param", cam)
--目標中心回転
@目標中心回転
--track0:側方回転,-3600,3600,0,0.01
--track1:水平回転,-3600,3600,0,0.01
--track2:垂直回転,-3600,3600,0,0.01
--dialog:傾き基準/chk,use_cameraman_angle=0;
local Q = {
qt = function(axis, degree)
local theta = degree*math.pi/180*0.5
local cos = math.cos(theta)
local sin = math.sin(theta)
local x=axis[1]
local y=axis[2]
local z=axis[3] or 0
local l=math.sqrt(x*x + y*y + z*z)
return {x * sin / l, y * sin / l, z * sin / l, cos}
end,
rotate = function(pos, q)
local x=pos[1]
local y=pos[2]
local z=pos[3] or 0
local qx=q[1]
local qy=q[2]
local qz=q[3]
local qr=q[4]
local x_=qr*x+qy*z-qz*y
local y_=qr*y+qz*x-qx*z
local z_=qr*z+qx*y-qy*x
local r_=-qx*x-qy*y-qz*z
return {-r_*qx+qr*x_-y_*qz+z_*qy, -r_*qy+qr*y_-z_*qx+x_*qz, -r_*qz+qr*z_-x_*qy+y_*qx}
end
}
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
dot = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return x1*x2 + y1*y2 + z1*z2
end,
cross = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return {y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1*x2}
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end,
length = function(v)
local x=v[1]
local y=v[2]
local z=v[3] or 0
return (x*x + y*y + z*z)^0.5
end,
eq = function(lhs, rhs)
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
return
EQ(lhs[1], rhs[1]) and
EQ(lhs[2], rhs[2]) and
EQ(lhs[3], rhs[3])
end
}
local V2 = {
unit = function(v)
local l = math.sqrt(v[1]^2 + v[2]^2)
return {v[1]/l, v[2]/l}
end,
length = function(v)
return math.sqrt(v[1]^2 + v[2]^2)
end,
dot = function(v1, v2)
return v1[1] * v2[1] + v1[2] * v2[2]
end,
cross = function(v1, v2)
return v1[1] * v2[2] - v1[2] * v2[1]
end
}
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
local function get_angle_z(eye_, ue_)
local eye = V.unit(eye_)
local ue = V.cross(eye, V.cross(V.unit(ue_), eye))
local axis = V.cross(eye, {0, 0, 1})
local angle = math.deg(math.acos(V.dot(eye, {0, 0, 1})))
if(not V.eq(axis, {0, 0, 0}))then
ue = Q.rotate(ue, Q.qt(axis, angle))
end
angle = 180 - math.deg(math.atan2(ue[1], ue[2]))
local singular = 0
if(ue[2] > 0)then
singular = 180
end
return angle, singular
end
local rz = obj.track0
local ry = obj.track1
local rx = obj.track2
cam = obj.getoption("camera_param")
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z} --視線ベクトル
local loc = {cam.x - cam.tx, cam.y - cam.ty, cam.z - cam.tz} --目標点基準のカメラ位置
local ue = {cam.ux, cam.uy, cam.uz}
local az = V.unit(eye)
local ax = V.cross(V.unit(ue), az)
local ay = V.cross(az, ax)
local q
--カメラ系の座標軸を求めるS
local q = Q.qt(az, -cam.rz)
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
local cam_rz = cam.rz
cam.rz = 0
if(use_cameraman_angle == 1)then
local angle_z, singular = get_angle_z(eye, ue)
q = Q.qt(az, cam_rz - (angle_z + singular))
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
cam.rz = cam_rz - (angle_z + singular)
end
--カメラ系の座標軸を求めるE
q = Q.qt(eye, rz)
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
q = Q.qt(ay, ry)
loc = Q.rotate(loc, q)
az = Q.rotate(az, q)
q = Q.qt(ax, rx)
loc = Q.rotate(loc, q)
ay = Q.rotate(ay, q)
az = Q.rotate(az, q)
--傾き合わせ
if(use_cameraman_angle == 1)then
ay = Q.rotate(ay, Q.qt(az, -cam.rz))
cam.rz = 0
end
cam.x = loc[1] + cam.tx
cam.y = loc[2] + cam.ty
cam.z = loc[3] + cam.tz
cam.ux = ay[1]
cam.uy = ay[2]
cam.uz = ay[3]
obj.setoption("camera_param", cam)
--マニュアルターゲット
@マニュアルターゲット
--track0:ターゲット,1,100,1
--track1:カメラ距離,0,20000,0
--track2:イーズ,-100,100,0,0.01
--track3:なめらか,0,100,0,0.01
--dialog:ターゲット1,tar1=0;ターゲット2,tar2=0;ターゲット3,tar3=0;ターゲット4,tar4=0;ターゲット5,tar5=0;ターゲット6,tar6=0;ターゲット7,tar7=0;ターゲット8,tar8=0;ターゲット9,tar9=0;ターゲット10,tar10=0;指定方法[0-2],setM=1;
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end,
sub = function(lhs, rhs)
return {lhs[1]-rhs[1], lhs[2]-rhs[2], lhs[3]-rhs[3]}
end,
eq = function(lhs, rhs)
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
return
EQ(lhs[1], rhs[1]) and
EQ(lhs[2], rhs[2]) and
EQ(lhs[3], rhs[3])
end
}
local time_search = function(trackbar_no, value)
--[[
トラックバーの値が value になる最初の時間を返す
前提:トラックバーは直線移動で増加すること
]]
local v = math.floor(obj.getvalue(trackbar_no, 0))
if(value <= v)then
return 0
end
local s = 0
local e = math.ceil(obj.totaltime * obj.framerate)
local i
while(true)do
if(s == e)then
break
end
i = math.floor((s + e) / 2)
v = math.floor(obj.getvalue(trackbar_no, i / obj.framerate))
if(value <= v)then
e = i
else
s = i + 1
end
end
return s / obj.framerate
end
local target = {tar1, tar2, tar3, tar4, tar5, tar6, tar7, tar8, tar9, tar10}
if(type(tar1) == "table")then
--[[
local target__ = tar1
target[1] = tar1[1]
for i = 2, #target__ do
target[#target + 1] = target__[i]
end
]]
target = tar1
end
for i = 1, #target do
if(type(target[i]) ~= "number")then
target[i] = 0
end
if(setM == 1)then
target[i] = target[i] + obj.layer
elseif(setM == 2)then
if(i == 1)then
target[i] = obj.layer + target[i]
else
target[i] = target[i - 1] + target[i]
end
end
end
local id = obj.track0
local distance = obj.track1
local ez = obj.track2 / 100
local smooth = obj.track3 / 100
cam = obj.getoption("camera_param")
local path = {cam.tx, cam.ty, cam.tz, cam.tx, cam.ty, cam.tz, cam.tx, cam.ty, cam.tz, cam.tx, cam.ty, cam.tz}
for i = 1, 4 do
local id__ = math.min(#target, math.max(1, math.floor(id) + (i - 2)))
if(target[id__] > 0 and target[id__] ~= obj.layer)then --zero means camera
path[(i - 1) * 3 + 1] = obj.getvalue(string.format("layer%d.x", target[id__])) or cam.tx
path[(i - 1) * 3 + 2] = obj.getvalue(string.format("layer%d.y", target[id__])) or cam.ty
path[(i - 1) * 3 + 3] = obj.getvalue(string.format("layer%d.z", target[id__])) or cam.tz
end
end
local t = id - math.floor(id)
if(ez ~= 0)then
ez = (ez >= 0 and (1 + 4 * ez)) or (1 + 0.4 * ez)
t__ = (t <= 0.5 and t) or (1 - t)
t__ = t__ * 2
t__ = ((math.cos(math.rad(-180+90*t__))+1)^(ez))/2
t = (t <= 0.5 and t__) or (1 - t__)
end
local point = V.add(
V.mul(
V.add(
V.mul({path[4], path[5], path[6]}, (1 - t)),
V.mul({path[7], path[8], path[9]}, t)
),
(1 - smooth)
),
V.mul({obj.interpolation(t, unpack(path))}, smooth)
)
cam.tx = point[1]
cam.ty = point[2]
cam.tz = point[3]
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z}
if(distance ~= 0)then
eye = V.mul(V.unit(eye), distance)
cam.x = cam.tx - eye[1]
cam.y = cam.ty - eye[2]
cam.z = cam.tz - eye[3]
end
if(V.eq({cam.ux, cam.uy, cam.uz}, V.unit(eye)))then
cam.ux = -cam.ux
cam.uy = -cam.uy
cam.uz = -cam.uz
end
obj.setoption("camera_param", cam)
--目標からずれた位置中心回転
@目標からずれた位置中心回転
--track0:側方回転,-3600,3600,0
--track1:左右ずれ,-20000,20000,0
--track2:上下ずれ,-20000,20000,0
local Q = {
qt = function(axis, degree)
local theta = degree*math.pi/180*0.5
local cos = math.cos(theta)
local sin = math.sin(theta)
local x=axis[1]
local y=axis[2]
local z=axis[3] or 0
local l=math.sqrt(x*x + y*y + z*z)
return {x * sin / l, y * sin / l, z * sin / l, cos}
end,
rotate = function(pos, q)
local x=pos[1]
local y=pos[2]
local z=pos[3] or 0
local qx=q[1]
local qy=q[2]
local qz=q[3]
local qr=q[4]
local x_=qr*x+qy*z-qz*y
local y_=qr*y+qz*x-qx*z
local z_=qr*z+qx*y-qy*x
local r_=-qx*x-qy*y-qz*z
return {-r_*qx+qr*x_-y_*qz+z_*qy, -r_*qy+qr*y_-z_*qx+x_*qz, -r_*qz+qr*z_-x_*qy+y_*qx}
end
}
local V = {
unit = function(v)
local x=v[1]
local y=v[2]
local z=v[3]
local l = (x*x + y*y + z*z)^0.5
return {x/l, y/l, z/l}
end,
dot = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return x1*x2 + y1*y2 + z1*z2
end,
cross = function(lhs, rhs)
local x1=lhs[1]
local y1=lhs[2]
local z1=lhs[3] or 0
local x2=rhs[1]
local y2=rhs[2]
local z2=rhs[3] or 0
return {y1*z2 - z1*y2, z1*x2 - x1*z2, x1*y2 - y1*x2}
end,
mul = function(v, scale)
return {v[1]*scale, v[2]*scale, v[3]*scale}
end,
add = function(lhs, rhs)
return {lhs[1]+rhs[1], lhs[2]+rhs[2], lhs[3]+rhs[3]}
end,
length = function(v)
local x=v[1]
local y=v[2]
local z=v[3] or 0
return (x*x + y*y + z*z)^0.5
end,
eq = function(lhs, rhs)
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
return
EQ(lhs[1], rhs[1]) and
EQ(lhs[2], rhs[2]) and
EQ(lhs[3], rhs[3])
end
}
local V2 = {
unit = function(v)
local l = math.sqrt(v[1]^2 + v[2]^2)
return {v[1]/l, v[2]/l}
end,
length = function(v)
return math.sqrt(v[1]^2 + v[2]^2)
end,
dot = function(v1, v2)
return v1[1] * v2[1] + v1[2] * v2[2]
end,
cross = function(v1, v2)
return v1[1] * v2[2] - v1[2] * v2[1]
end
}
local EQ = function(lhs, rhs)
return math.abs(lhs - rhs) < (1e-10)
end
local function get_angle_z(eye_, ue_)
local eye = V.unit(eye_)
local ue = V.cross(eye, V.cross(V.unit(ue_), eye))
local axis = V.cross(eye, {0, 0, 1})
local angle = math.deg(math.acos(V.dot(eye, {0, 0, 1})))
if(not V.eq(axis, {0, 0, 0}))then
ue = Q.rotate(ue, Q.qt(axis, angle))
end
angle = 180 - math.deg(math.atan2(ue[1], ue[2]))
local singular = 0
if(ue[2] > 0)then
singular = 180
end
return angle, singular
end
--平行移動関数
local function shift(offset)
cam = obj.getoption("camera_param")
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z} --視線ベクトル
local ue = {cam.ux, cam.uy, cam.uz}
local az = V.unit(eye)
local ax = V.cross(V.unit(ue), az)
local ay = V.cross(az, ax)
local q
--カメラ系の座標軸を求めるS
local q = Q.qt(az, -cam.rz)
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
--カメラ系の座標軸を求めるE
offset = V.add(V.add(V.mul(V.unit(ax), offset[1]), V.mul(V.unit(ay), offset[2])), V.mul(V.unit(az), offset[3]))
cam.x = cam.x + offset[1]
cam.y = cam.y + offset[2]
cam.z = cam.z + offset[3]
cam.tx = eye[1] + cam.x
cam.ty = eye[2] + cam.y
cam.tz = eye[3] + cam.z
obj.setoption("camera_param", cam)
end
--目標中心回転関数
local function rotate(angle)
local rx, ry, rz = unpack(angle)
cam = obj.getoption("camera_param")
local eye = {cam.tx - cam.x, cam.ty - cam.y, cam.tz - cam.z} --視線ベクトル
local loc = {cam.x - cam.tx, cam.y - cam.ty, cam.z - cam.tz} --目標点基準のカメラ位置
local ue = {cam.ux, cam.uy, cam.uz}
local az = V.unit(eye)
local ax = V.cross(V.unit(ue), az)
local ay = V.cross(az, ax)
local q
--カメラ系の座標軸を求めるS
local q = Q.qt(az, -cam.rz)
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
local cam_rz = cam.rz
cam.rz = 0
--カメラ系の座標軸を求めるE
q = Q.qt(eye, rz)
ax = Q.rotate(ax, q)
ay = Q.rotate(ay, q)
q = Q.qt(ay, ry)
loc = Q.rotate(loc, q)
az = Q.rotate(az, q)
q = Q.qt(ax, rx)
loc = Q.rotate(loc, q)
ay = Q.rotate(ay, q)
az = Q.rotate(az, q)
cam.x = loc[1] + cam.tx
cam.y = loc[2] + cam.ty
cam.z = loc[3] + cam.tz
cam.ux = ay[1]
cam.uy = ay[2]
cam.uz = ay[3]
obj.setoption("camera_param", cam)
end
--平行移動1
shift({-obj.track1, obj.track2, 0})
--回転
rotate({0, 0, obj.track0})
--平行移動2
shift({obj.track1, -obj.track2, 0})
テンプレ
- 最終更新:2012-03-03 00:34:05