2024年1月26日 星期五
2024年1月25日 星期四
首届动画花火活动营之嘉宾主题分享内容 第一章
分享嘉宾是作为原画师的Dogdog绘,从业6年+,
代表作品《英雄再临》、《没出息的阴阳师一家》第3季、《忍者必须死3》OP动画重制版。
先自我介绍,我叫DogDog绘,也可以叫我华哥(仪式感很重要),那我们就开始今天的分享。
https://www.bilibili.com/video/BV1SG411H7W1?vd_source=e17b5aa636fbe4e9dc355a15f40f9494
https://www.bilibili.com/video/BV1nF411K7mo?vd_source=e17b5aa636fbe4e9dc355a15f40f9494
一、对比
首先是第一个,就是我们要讲的第一个东西是相对论(对比),世间万物都是从相对论开始的。
最近英雄联盟皮肤打折了,然后我说要买,说:“好赚呐,打五折了,买买买!”
然后还想起那个表情包就说:“对对对,你赚了,我亏大了。”
但为什么我会觉得 50 块钱的皮肤是赚的?这皮肤真的值这个钱吗?
其实因为有了之前它原价是 100 的皮肤,现在打五折了我就(觉得)赚。
但平时我们真正要思考的是:这个皮肤真的值 50 块钱吗?
其实人类无时无刻都在比较:什么东西值钱,什么不值钱, 什么速度快什么速度慢,
包括幸福感什么的都是。
(比如)小明他得了 2 万块钱年终奖,他决定买些东西给妈妈、买些东西给老婆、买些东西给孩子,他觉得很快乐。突然他知道他有个同事年终奖是 5 万,他就非常不开心了。
但其实他自己得到的并没有变化,但是这种互相的对比就让他觉得自己是亏了,就不开心了。
回到画画上,其实很多东西都是对比出来的。
在原画上有些东西我们可以看得出:
对比有很多种,可以是大小的对比、速度的对比、还有信息量、节奏等。
2024年1月12日 星期五
etAEChangeProperties取得AE所有變更過後的特效參數 (aescripts)
download: https://2996510522021.gumroad.com/l/fzjrlc
學習別人或書中分享的工程檔的時候,老是不知道對方改了哪些參數搞得很煩
這個時候這個小腳本可以幫上忙。畢竟參數..... 實在是太多了
2024年1月11日 星期四
2024年1月8日 星期一
"DISABLE IN VIEWPORTS"属性设置关键帧
通过手动选择的方式设置关键帧,你可以使用以下脚本。这个脚本允许你选择一个或多个对象,然后在当前帧为它们的"DISABLE IN VIEWPORTS"属性设置关键帧。
import bpy
# 获取当前场景
scene = bpy.context.scene
# 记录当前帧数
current_frame = scene.frame_current
# 获取当前选择的对象列表
selected_objects = bpy.context.selected_objects
# 遍历选中的对象
for obj in selected_objects:
# 设置当前帧
scene.frame_set(current_frame)
# 获取当前对象的“DISABLE IN VIEWPORTS”属性的值
disable_in_viewports = obj.hide_viewport
# 在当前帧启用或禁用视口显示
obj.hide_viewport = disable_in_viewports
# 插入关键帧
obj.keyframe_insert(data_path="hide_viewport")
# 恢复原始帧数
scene.frame_set(current_frame)
2024年1月7日 星期日
Notepad++ 直接執行python
cmd /k C:\Users\XXXXXPLAYER\AppData\Local\Programs\Python\Python312/python.exe "$(FULL_CURRENT_PATH)" &; PAUSE &; EXIT
#綠色是你py安裝目錄
2024年1月1日 星期一
Blender將粒子系統轉換為動畫網格(py腳本) 帶旋轉約束
# Set these to False if you don't want to key that property.
KEYFRAME_LOCATION = True
KEYFRAME_ROTATION = True
KEYFRAME_SCALE = True
KEYFRAME_VISIBILITY = False # Viewport and render visibility.
KEYFRAME_VISIBILITY_SCALE = True
def create_objects_for_particles(ps, obj):
# Duplicate the given object for every particle and return the duplicates.
# Use instances instead of full copies.
obj_list = []
mesh = obj.data
particles_coll = bpy.data.collections.new(name="particles")
bpy.context.scene.collection.children.link(particles_coll)
for i, _ in enumerate(ps.particles):
dupli = bpy.data.objects.new(
name="particle.{:03d}".format(i),
object_data=mesh)
particles_coll.objects.link(dupli)
obj_list.append(dupli)
return obj_list
def match_and_keyframe_objects(ps, obj_list, start_frame, end_frame):
# Match and keyframe the objects to the particles for every frame in the
# given range.
for frame in range(start_frame, end_frame + 1):
print("frame {} processed".format(frame))
bpy.context.scene.frame_set(frame)
for p, obj in zip(ps.particles, obj_list):
match_object_to_particle(p, obj)
keyframe_obj(obj)
def match_object_to_particle(p, obj):
# Match the location, rotation, scale and visibility of the object to
# the particle.
loc = p.location
rot = p.rotation
size = p.size
if p.alive_state == 'ALIVE':
vis = True
else:
vis = False
obj.location = loc
# Set rotation mode to quaternion to match particle rotation.
obj.rotation_mode = 'QUATERNION'
obj.rotation_quaternion = rot
if KEYFRAME_VISIBILITY_SCALE:
if vis:
obj.scale = (size, size, size)
if not vis:
obj.scale = (0.001, 0.001, 0.001)
obj.hide_viewport = not(vis) # <<<-- this was called "hide" in <= 2.79
obj.hide_render = not(vis)
def keyframe_obj(obj):
# Keyframe location, rotation, scale and visibility if specified.
if KEYFRAME_LOCATION:
obj.keyframe_insert("location")
if KEYFRAME_ROTATION:
obj.keyframe_insert("rotation_quaternion")
if KEYFRAME_SCALE:
obj.keyframe_insert("scale")
if KEYFRAME_VISIBILITY:
obj.keyframe_insert("hide_viewport") # <<<-- this was called "hide" in <= 2.79
obj.keyframe_insert("hide_render")
def add_copy_rotation_constraint(obj):
# Add Copy Rotation constraint to the object.
copy_rotation_constraint = obj.constraints.new(type='COPY_ROTATION')
# Set the target to the original animated object (assuming it's the active object).
copy_rotation_constraint.target = bpy.context.selected_objects[0]
copy_rotation_constraint.owner_space = 'LOCAL'
def main():
#in 2.8 you need to evaluate the Dependency graph in order to get data from animation, modifiers, etc
depsgraph = bpy.context.evaluated_depsgraph_get()
# Assume only 2 objects are selected.
# The active object should be the one with the particle system.
ps_obj = bpy.context.object
ps_obj_evaluated = depsgraph.objects[ ps_obj.name ]
obj = [obj for obj in bpy.context.selected_objects if obj != ps_obj][0]
for psy in ps_obj_evaluated.particle_systems:
ps = psy # Assume only 1 particle system is present.
start_frame = bpy.context.scene.frame_start
end_frame = bpy.context.scene.frame_end
obj_list = create_objects_for_particles(ps, obj)
match_and_keyframe_objects(ps, obj_list, start_frame, end_frame)
for generated_obj in obj_list:
add_copy_rotation_constraint(generated_obj)
if __name__ == '__main__':
main()