Posts

如何给虚拟人物起名

  Character Names: 6 Creative Ways to Name Your Fiction Characters (thewritelife.com) ‎1. 使用字符名称生成器将名称与主题匹配‎ 你热爱象征主义吗?写下你的故事的主题,然后前往‎ ‎一个名字生成器网站‎ ‎或‎ ‎婴儿名字网站‎ ‎搜索与这些主题相关的名称。‎ ‎2. 使用其他种类的名字 试试你的宠物的名字作为虚构人物的名,你的街道的名字作为你的角色的姓。‎ ‎ ‎3. 使用您最喜爱的作者的姓名‎ 很多小说都这么做,比如美丽新世界中大量使用参考了现实中的人名,马克思,福特,列宁等等,因为人们熟知这些人物,所以可以有更深一层的含义。 ‎4. 使用翻译‎ ‎然而,要使用这个,你必须有一个名字在心中。把自己的名字写在翻译上,让它翻译一下。‎ ‎前往您最喜爱的搜索引擎,搜索"姓名翻译"或"我的名字",并键入任何语言,如中文或希伯来语。你会发现大量的免费名称翻译玩。‎ ‎5. 善用互联网和您的创意‎ ‎不管是什么类型,想想你的故事发生在哪里。您的设置可以激发角色的名字。‎ ‎你的故事包括山吗?它们是你虚构人物文化的一部分吗?然后研究那些把山作为文化一部分的人,比如秘鲁的安第斯人和北美的阿巴拉契亚人。‎ ‎如果你的故事发生在一个遥远的星球上呢?你的设置可能看起来有点像你以前在地球上见过的地方, 或者几个地方的混合体。‎ ‎想想那些真正的地方,激发你的异地环境,然后想想真正的人,使这些地方他们的家。研究这些地方,了解你的虚构文化。‎ ‎在完成对启发你虚构的文化或文化的研究后,使用这些真实文化中的名字来启发你虚构的人物的名字。‎ ‎6. 使用身边人的名字 ‎这是创建虚构角色名称的最简单方法,也许你父亲是你的英雄,所以你决定以他的名字命名你的主角。‎ ‎当然,如果你决定要这么做,不要忘记提前告知并获得同意

活在当下-从尾巴摇狗的荒谬中解放自我

Image
  当下与过去的关系好像一条船和它产生的尾流--不是尾流推动了船,不是“尾巴摇狗”。行为是自发的。为什么并不重要,是什么才是。 时间的过程真很像一艘在海中航行的船,船在前进的同时在船尾产生了一条逐渐淡化的水波。就像我们能从这些渐渐消失的水波中看出船曾经的轨迹一样,我们能从记忆中得知自己曾经的所作所为。但随着我们回看过去,一直到史前时代,我们使用所有各种仪器和科学检测曾经发生了什么,最终达到一个点。在这个点上过去的记录在刚刚消失,就像船的尾波一样。最重要的是要记住,在这个过程中,尾波并没有推动船,好比“尾巴摇狗”一样。 假如有个熊孩子做了坏事,人们说要揍他一顿他就改了,另外的人可能会这不公平!是他的父母把他教育好,所以要惩罚他的父母。而他的父母又说“我很抱歉,但是我的父母也很坏,他们从小就不管我,导致我也没法教育好我的小孩”。然而这小孩的祖父母早就过世了,我们也不可能去惩罚他们了。假设我们可以一直往前追溯知道伊甸园的亚当和夏娃,然后说一切都怪他们!夏娃说:不!是蛇诱惑我这么做的,是蛇的错!当创世记中的上帝问:夏娃你趁我不在偷吃了智慧树上的果子,我告诉过你不应该吃的! 她说哦,我确实吃了,但是是蛇诱惑我这么干的!上帝看看蛇,蛇没有说任何借口(他可能眨了眨眼)。因为蛇是天使,他是明智的,他知道当下从哪里开始。  所以如果你坚持被过去所驱动,所决定,那是你自己的事。 但事实是一切从当下开始。但我们趋于与过去建立联系,因为这能让别人从过去的印象中了解我们现在话语中传达的意思。  如果你问我我为什么要说这些,我可以说我以这种方式谋生,或者说我有一条我想对你传达的信息。但这并不是原因。我说话的原因与鸟儿唱歌一样,跟星星眨眼一样。我呈现了它(原为为I dig it), 你为什么要呈现他?我可以继续回答类似这样的人类动机和心理问题,但这永远不会解释一件事,因为用过去解释等同于拒绝解释。你所做的是推迟解释,你不停的往前追述 ,最终什么都没有解释。能解释事情的只有当下。 所以为什么你现在有这样的行为?这有点作弊,因为也是同样未作任何解释,因为现在所发生的就像寂静中发出声音,所有的这一切从空来,这在我的另一个关于空的力量中有所说明。所有的生命突然从空间中涌现出来,砰!就这样出现了。又有人问了为啥砰的一声就出现了,这是个无用的问题。因为有意思的点不在于为什么,而在...

Blender低模修复法线光照

Image
 

Blender导出到Godot集成

Image
  Blender ESCN exporter — Godot Engine (stable) documentation in English godotengine/godot-blender-exporter: Addon for Blender to directly export to a Godot Scene (github.com) KhronosGroup/glTF-Blender-IO: Blender glTF 2.0 importer and exporter (github.com) Obj(wavefont)只支持静态模型,无法导出骨骼,无法打包texture fbx支持骨骼,texture。注意blender导出fbx要打包texture时勾选以下选项。不过fbx导出有很多问题,如贴图重复(只能导出albedo,其他贴图均出现问题),有shapekey时无法显示模型的等,建议使用更为现代的gltf格式。 各格式比较 Popular 3D model file format | Comparison tables - SocialCompare A Study on the Performance Comparison of 3D File Formats on the Web -International journal of advanced smart convergence | Korea Science 从blender导出到godot还是使用gltf embedded效果最佳,其他格式可能发生各种奇怪问题。导出注意gltf导入godot如果不能正常显示texture,取消勾选keep on reimport再重新导入

Animate in Krita : Indie Game Family

Image
 

游戏3d资产创建的基本工作流

Image
1.创建高模(sculping/vertex modeling) 2.创建低模(Retopology/ Clean modifier/ decimation) 根据情况不同,player级别大约为2000-50000面之间 3.UV展开 4. 烘焙贴图 5.贴图绘制 参考视频

Reaper降噪方法

Image
 首先有一段录音A和一段A中单独的白噪音 首先添加效果器 然后添加ReaFir 设定如下参数后频谱应当到最底部。 然后单独播放白噪音部分,可以循环多播放几次。如果效果不好,FFT大小可以实验更改。 可以点击频谱进行微调,按住ctrl可整体调整。过高容易影响音质,过低起不到去噪效果。 参考视频https://youtu.be/31phzT7pxkk

使用Avidemux对视频批量转换和处理

Image
 首先在这里下载avidemux:  Avidemux - Downloads 1.打开avidemux, 拖入要编辑的视频 2.设定encoder-选择h264或者其他(h264同等大小质量最高) 3.添加filter,这里可以对视频进行裁切,去噪等等操作。 笔者这里是对视频进行加速-顺序添加 change fps resample fps 在注意第一步的输入fps应当和第二部分的fps移植。fps输出值调大则加速,调小则减速。内部调整默认最大是99,后面我们可以从外面更改。注意加速超过一定程度预览会出现卡顿,视频输出是正常的不必担心。 4.这里可以先保存视频测试一下是否正常 5.file-save project保存项目,另存到settings.py文件。 6.打开python文件,删除以下几行。这里也可以对视频操作进行更改,比如加速的倍数,比从软件内部更改更方便。完成后保存文件。 adm.loadVideo  adm.clearSegments  adm.addSegment  adm.markerA  adm.markerB 7.新建一个bat批处理文件,输入以下几行,第一行路径改为你的avide安装路径。settings.py改为你的avidemux项目python文件名。保存文件 set avidemux="C:\[path-to-Avidemux]\Avidemux.exe" : %%~nf returns the filename without the extension for %%f in (*.mp4 *.mov *.mts) do ( %avidemux% --load "%%f" --run settings.py --save "%%~nf.mkv" --quit ) 8.新建一个文件夹,将批处理文件,settings.py文件, 要转换的视频放进去。 9.运行bat 10.喝杯咖啡等待一下,大功告成! 参考来源 Batch processing video files with Avidemux - Gaelan Lloyd

Twtich直播教程

Image
 1.前提条件-你能打开并观看twitch(至少流畅才能保证推流质量) 2.下载工具-obs(不使用twitch studio是因为对显示器不太友好,且有评测表示占用稍高,灵活性较差。steamerlabs则也是obs内核,且部分插件是收费的。)。安装obs.live(这个好像不装也可以,装了省事一点,自带一些面板) 3.下载proxifier--为obs添加规则,使用SOCKS5进行推流 4.从obs登录twitch,可以使用直播密钥或者用账户登录。服务选择twitch或直接输入特定的twitch推流服务器url 4.OBS中view-docks-custom docks添加特殊面板,从这里你可以添加chat,activity feed等管理twitch直播的工具,也可以从 Widgets Gallery / Streamlabs 获取扩展面板的url并在obs上使用,前面没安装obs.live的可以从这里添加twitch的聊天面板 5.安装ASIO 安装ASIO驱动 ASIO4ALL Official Home ,并为OBS添加asio的插件 Releases · Andersama/obs-asio (github.com) 安装好后从obs面板中添加ASIO,并配置左右声道。完成后可以添加降噪的filter。 6.添加耳返 注意如果开启了播放电脑内置声音的话这里选择mute output,否则选择monitor and output。选错会出现回声或没有声音的情况 7.测试 点击start recording进行试验录制并查看录像是否正常,有问题则进行调整。 完成后点击start streaming就大功告成了!别忘了在twitch中打开VOD并查看自己往期直播的效果,及时调整。笔者就是发现自己的声音有很大的底噪,安装了asio解决了这个问题。

Great Godot tutorial list

Image
Table of Contents · Game Programming Patterns How to Make a Simple State Machine in Godot 3.1 - YouTube 15 TRICKS WE WISH WE KNEW EARLIER | Godot Engine - YouTube Godot: Organize exported variables - YouTube

Stereo Audio vs. Binaural Audio vs. Spatial Audio-立体声,双耳音频和三维音频的区别

 Stereo Audio:立体声 立体声音频本质上是通过两个不同的音频通道录制的。因此,通过耳机的一侧传输的音频将不同于另一侧的音频。在这种情况下,立体声会产生沉浸式的错觉,但不会创建三维或交互式的声音场景。 双耳音频在技术上是指以一个人能像在现实世界中那样听到声音的方式捕获的音频。音频是使用假头录制的,其耳朵中嵌入麦克风,并放置在发出声音的环境中。例如,在一个小浴室录制一个鼓的声音,由于周围大部分是瓷砖,听起来户外环境中的鼓的声音是完全不同的。问题是每个人的耳朵都有点不同。除非假头是您自己头部的精确复制品,否则听起来不会完全一样。同样,除非你有一个训练有素的耳朵,你也很可能无法区分。通常,双耳录音可以使用非常古老的技术进行录制。在大多数情况下,在假人头上钻一个洞,在耳朵周围放几个小麦克风,然后把假人放在录制环境中,非常简单。 然后是三维音频。三维音频模拟现实生活中的声音,根据音源相对于你的头和它所面对的方向, 使它们听起来来自在空间中的真实位置,声音听起来更真实。通常用于游戏和一些其他的交互式场景中。 原文链接: The Major Differences Between Stereo Audio vs. Binaural Audio vs. Spatial Audio (highfidelity.com)

LDjam49体验

Image
  在这我提交的游戏! Feed Me Pizza! | ldjam.com | Ludum Dare game jam Results Final results Overall:   239 th  (3.924 average from 48 ratings) Fun:   379 th  (3.739 average from 48 ratings) Innovation:   399 th  (3.63 average from 48 ratings) Theme:   876 th  (3.4 average from 47 ratings) Graphics:   37 th  (4.62 average from 48 ratings) Audio:   361 st  (3.667 average from 38 ratings) Humor:   201 st  (3.841 average from 46 ratings) Mood:   129 th  (4.089 average from 47 ratings) 玩过的游戏列表(加粗的是我觉得还不错的) Potion Commotion | ldjam.com | Ludum Dare game jam WOLFGUN | ldjam.com | Ludum Dare game jam Jingoku | ldjam.com | Ludum Dare game jam Uniquackle | ldjam.com | Ludum Dare game jam Divine Intervention | ldjam.com | Ludum Dare game jam Dog ate the bomb | ldjam.com | Ludum Dare game jam Love will Prevail | ldjam.com | Ludum Dare game jam Unstable Towers | ldjam.com | Ludum Dare game jam Larry's Whacky Alchemy Lab | ld...

Windows10 和 Windows7 的工作组文件共享

Image
 如果你需要在多台电脑上工作,或者有多人合作的话,文件共享是必不可少的。可能很多人选择使用通讯软件或者如google drive的在线存储业务。今天就介绍另一种更加方便的方法。 以windows10为例: 首先勾选控制面板-防火墙-中的文件和打印机共享 接着搜索在windows中搜索服务service-启用这两个服务,笔者的是manual手动模式也是正常的,如果不行可改为自动 搜索gpedit打开组策略编辑器启用访客访问   打开控制面板,允许修改共享文件,并取消访客密码。如果你不是私有网络或者共享文件比较重要,请看下一步。如果取消密码后又自动勾选可能是因为访客用户有设置了密码。 右键我的电脑,管理-用户-为访客账户设定密码。这里你可以自定义你想要的用户 新建文件夹-添加所有人(也可以添加上一步你设定的用户,并分配不同权限)-设定共享权限-只读或读写 最后最重要的是,连接到 同一个局域网下面就可以查看或更改共享文件夹了。

Godot 基本和进阶语法注意事项(长期更新)

多重继承 Godot 目前不支持多重继承。如果你有一个entity类继承自node,然后你有一个plant类,既要继承entity,又要有Sprite类的功能,这是不行的,只能通过增加child node,或使用singleton来实现。 Add a GDScript Trait system. · Issue #23101 · godotengine/godot (github.com) Inner Class 类的逻辑分组:如果一个类只对另一个类作用,那么将它嵌入那个另一个类并将两者保持在一起是合乎逻辑的,嵌套这样的"帮助类"使得它们的包更加简化。 内部类extend可以和外部类不一致,如外部extends Spatial, 内部extends Sprite godot中内部类不可访问外部类成员变量,这会造成cyclic dependence循环引用,可能在4.0会得到更好的解决 想要继承内部类, extends "somefile.gd".SomeInnerClass 不使用extends时,内部类是默认继承reference的,自带内存管理 类的初始化Init 如果覆写了_init()函数,则可以在new()时传入参数并初始化 extends Node2D func _ready(): var p = Creature.new("eagle") print (p.name) var q = Creature.new() print(q.name) class Creature extends Resource: var name = "" func _init(_name = "creature"): name = _name 带有参数的_init()在绑定到scene时,使用instance()不可以传入参数(_init参数需要默认值,否则可能报错),packedscene也没有new()函数 如果使用继承,则子类默认以空参数先执行父类_init() 继承和函数重写override 内置函数如_process(delta), _physics_process(delta),会自动调用继承父级的同名函数,顺序是先调用子级,再调用父...

Godot 场景树及常见调用顺序

Godot场景树func调用顺序 -Root     -Child1          -GrandChild1     -Child2  后面接的数字代表当时子节点数 init时不能获取name    init0  init0  init0  init0   Root enter tree!2 Child1 enter tree!1 GrandChild1 enter tree!0 Child2 enter tree!0 GrandChild1 ready!0 Child1 ready!1 Child2 ready!0 Root ready!2 Child2 exit tree!0 GrandChild1 exit tree!0 Child1 exit tree!1 Root exit tree!2 可以看到-enter tree 自上往下,并且必须子节点全部enter tree后才能继续下一个节点,exit tree顺序相反。ready则是最上面的最子节点先完成,然后是父节点。只有一个node的所有子节点全部ready后,父节点ready,然后才会向下继续。 _ready函数 _ready()函数只在节点第一次添加入树内触发,如果想在节点移除再添加后仍旧触发_ready(),请手动调用request_ready(),注意,该方法不会立即被调用,但会在节点再次添加到场景树时自动触发ready的调用 onready在_ready前,onready的节点进入树内时调用 使用tool关键字后,节点在创建时调用(后面切换scenetab不再调用) _enter_tree函数 进入树内时调用 使用tool关键字后,切换scenetab时调用 添加子节点 添加子节点无需父节点在树中,但是被添加的节点_enter_tree不会执行,只有父节点进入树内后,enter_tree,ready等才会依次开始执行 从场景树移除节点 使用remove_child(node)移除节点,注意此时节点并未删除,只是不在场景树内,相关函数如process不会得到执行。你可以再次使用add_child(node)将节点还原回场景树。 同一个n...

Godot 获取editor camera的hack方法

Godot中想要自己制作editor plugin的话,可能你需要获取编辑器相机参数,现在API并未提供接口,所以只能用比较hack的方式获取。代码如下 func get_editor_camera(camera_index):#get camera in the spatial editor(4 camera in spatial editor) var e = get_editor_interface().get_editor_viewport() var cam = e.get_child(1).get_child(1).get_child(3).get_child(0).get_child(cam_index).get_child(0).get_child(0).get_camera() # If the function not work, use code below to check(new version godot change the camera hierarchy) var root = e.get_parent() var all_nodes = [] var c = root.get_children() while !c.empty(): var child_list = []                         for i in c: child_list += i.get_children() all_nodes += child_list c = child_list for node in all_nodes: if node.get_class() == "Camera": print(node.transform) print(node.get_path()) for i in range(deep): node = node.get_parent() print(node.get_class() + str(node.get_index())) print("...

Some Pixel animation

Image
 

Godot常见错误(长期更新)

打印basis和打印basis.xyz不一致 注意打印basis是按行输出matrix的,而正常获取basis.xyz元素应该是按列         [a b c]  Basis = [d e f], Basis.X = [a, d, g]         [g h i] 屏幕空间投射仅在距离为cam  far出问题(大于小于都正常) Camera.project_position() always give wrong results when z_depth is Camera.far var pos_near = Cam.project_position(mouse_pos, Cam.near) var pos_far = Cam.project_position(mouse_pos, Cam.far - 1) get_node()返回null时,编辑器抛出异常。正确方式是使用get_node_or_null() 编辑器中使用remove_and_skip()可能造成闪退 Custom Class获取类名不一致 使用get_class()获取自定义类(使用class_name定义的类)只能获取其父类名。如 #npc.gd extends Sprite class_name NPC 此时获取npc_node.get_class()返回的是"Sprite"而不是"NPC",想要判断的话可以使用is关键字 node is NPC而要获取到正确类名的话要手动覆写get_class类 get_class():     return"NPC" get_class() and is_class() not returning class_name · Issue #21789 · godotengine/godot (github.com) 空项目出现单帧尖峰(未解决,可能是引起stutter卡顿的直接原因) Single frame spikes even in an empty project · Issue #33969 · godotengine/godot (github.com) Enabling verbose output makes `a...

How to make editor plugin in godot

Image
锁定node编辑状态 node.set_meta("_edit_lock_", true)   node.set_meta("_edit_lock_", null)      spatial Gizmo plugin Final result: 获取当前编辑场景的文件路径 get_tree().edited_scene_root.filename

Flash & Adobe Animation CC tips

画笔类工具有object和非object两种模式。前者绘制线条都是单独一根,故而看起来是包围图形也不能填充,因为它们是各自独立的。左边的propertie可以显示一个物体是什么 使用ctrl+g使分散的物体成为组group,ctrl+b将他们break apart打散。drawing object(即直接绘制的形状)也是一种特殊的组。注意只有通过ctrl+g分组后才能arrange各object的深度,原生的drawing object是不能变换深度的。 使用Q来进行自由缩放 使用F8来将一个物体做成symbol。symbol有三种模式-movieclip, graphic和button。 F5添加关键帧,F6复上一个图层可以作为下一个图层的形状遮罩mask,可以用来上渐变色或其他用途制并新建一个关键帧,shift+F6删除关键帧。F7创建空白帧。 IK骨骼建立后会单独生成骨骼图层。注意之前要将各个部分分别symbol化。在骨骼动画中不使用keyframe,代替之的是pose。 IK骨骼可以通过Q自由变换并移动部件本身或是部件的中心点来进行调整。 生成透明gif的效果一般不好,可以通过导出movie中选择png32位来导出序列帧 Preference中可以设置洋葱皮的颜色,但不能设置透明度。 上一个图层可以作为下一个图层的形状遮罩mask,可以用来上渐变色或其他用途(图层右键-mask) 色板swatches 层级:folder-swatches-color 文件夹有default swatches(不建议将颜色放进这里,很难找到),tagged swatches(相当于ai中的全局色,可以同时更改所有用此颜色的物体)和自定义文件夹。palette调色板存放在folder中,swatches色块存放在palette中。自定义文件夹中的调色板和色块可以互相拖动来移动位置 色板操作有5个,在面板的右下角。 1.convert to tagged swatches 转化为标签颜色--点击相应颜色后可转化为tagged swatches。 2.create new empty folder 创建新的色板文件夹 3.create new palette 在文件夹中创建新调色板 4.create new swatch在调色板中创建颜色,选择相应的palette后点击添加即可将色...