Posts

设计思维的五个阶段

设计思维 (Design Thinking) 是一个非线性的迭代过程,团队用它来理解用户,挑战假设,重新定义问题并创建创新的原型和测试解决方案。涉及五个阶段 - 移情,定义,构思,原型和测试 - 解决定义不明确或未知的问题最有用。 设计团队使用设计思维来解决定义不清/未知的问题(又名 邪恶的问题 ),因为他们可以以 人为中心 的方式重新构建这些问题 ,并专注于对用户最重要的事情 。在所有 设计过程中 ,设计思维几乎肯定是“跳出框框思考”的最佳选择。有了它,团队可以更好地进行 UX研究 , 原型设计和 可用性测试 ,以发现满足用户需求的新方法。 设计思维作为改善世界的价值,商业驱动力(谷歌,苹果和Airbnb等全球重量级人物已经将其发挥到显着效果)与其作为领先国际大学的热门学科的地位相匹配。 通过设计思维, 团队可以自由地生成突破性的解决方案 。使用它,您的团队可以获得难以访问的见解,并应用一系列动手方法来帮助找到创新的答案。 第 1 阶段: 移情  —   研究用户的需求 在这里,你应该对你试图解决的问题有同理心的理解,通常是通过用户研究。同理心对于以人为本的设计过程(如设计思维)至关重要,因为它可以让您放下自己对世界的假设,并真正了解用户及其需求。 第 2 阶段:定义 —   陈述用户的需求和问题 现在是时候积累在移情阶段收集的信息了。然后,您可以分析您的观察结果并综合它们,以定义您和您的团队已确定的核心问题。这些定义称为 问题陈述 。您可以创建 角色, 以帮助在进行 构思 之前保持以人为本的工作。 第3阶段:构思 -   挑战假设并创造想法 现在,您已经准备好产生想法了。前两个阶段的扎实知识背景意味着您可以开始“跳出框框思考”,寻找替代方法来查看问题,并确定您创建的问题陈述的创新解决方案。 头脑风暴 在这里特别有用。 第 4 阶段:原型设计 -   开始创建解决方案 这是一个实验阶段。目的是为发现的每个问题确定最佳解决方案。您的团队应该制作一些廉价的,缩小的产品版本(或产品中的特定功能),以调查您产生的想法。这可能涉及简单的 纸张原型设计 。 第 5 阶段:测试 —   试用您的解决方案 评估人员严格测试原型。虽然这是最后阶段,但设计思维是迭代的: 团队经常使用结果来 重新定义 一个或多个进一步的问题 。...

状态机与决策树

(2条消息) AI之用行为树来实现逻辑_丿寒风的博客-CSDN博客   游戏中的敌人行为基本可以分为三种: 探测:接受外界信息 决策:根据信息和决策结构做出判断 行动:做出具体行为 有限状态机:FSM 预先设定游戏中所有可能的状态,继而通过当前状态(与外界信息)决定接下来作什么,以及相应的状态转换。 例如:有三种行为,吃,休息和接电话。 首先确定所有状态:吃,休息,接电话。 接下来为各状态分配状态转换控制流 休息中:      听到电话铃 -> 接电话      感到饥饿 -> 吃饭 吃饭中:      听到电话铃 -> 接电话      吃饱 -> 休息 接电话中: 通话完毕 -> 休息 行为树:Behavior Tree 通过优先级顺序,控制流结构,以及任务执行的情况决定接下来做什么。属于一种抽象化,节点化的控制结构。 根节点     Selector:          接电话          吃饭          休息 尝试接电话,如果失败则尝试吃饭,如果失败则休息 其中,既可以将判断与task放在一起,也可以把判断作为单独的task 如 接电话:     如果有电话:          接电话          返回成功     否则:          返回失败 或者 接电话:     sequencer:          查看有电话          接电话

西洋镜动画zoetrope

Image
 

Godot安卓调试与导出

 安装Android SDK:(command line tools) Exporting for Android — Godot Engine (stable) documentation in English Android SDK - Command line tools Installation (Detailed) - YouTube 实机调试: 开启开发者模式(系统版本号介面连续点击) 连接USB 连接模式设置为传送文件 开启USB调试模式(设置内) 安卓10以上显示底部菜单:导出时取消immersive mode(沉浸模式) How do I make Android 10 navigation bar visible? - Godot Engine - Q&A 如果仍未起作用:安装自定义导出模板 Custom builds for Android — Godot Engine (stable) documentation in English 并修改 "android/build/res/values/themes.xml" 文件内的 <style name="GodotAppMainTheme" parent="@android:style/Theme.Black.NoTitleBar.Fullscreen"/> 改为 <style name="GodotAppMainTheme" parent="@android:style/Theme.Black.NoTitleBar"/> Immersive mode OFF for Android still doesn't show the status bar · Issue #48811 · godotengine/godot (github.com)

感知亮度转化公式

image - Formula to determine perceived brightness of RGB color - Stack Overflow   我认为您正在寻找的是RGB -> 亮度 转换公式。 光度/数字 国际电联BT.709 : Y = 0.2126 R + 0.7152 G + 0.0722 B 数字 ITU BT.601 (赋予R和B组件更大的权重): Y = 0.299 R + 0.587 G + 0.114 B 如果您愿意用精度换取性能,那么这个公式有两个近似公式: Y = 0.33 R + 0.5 G + 0.16 B Y = 0.375 R + 0.5 G + 0.125 B 这些可以快速计算为 Y = (R+R+B+G+G+G)/6 Y = (R+R+R+B+G+G+G+G)>>3

对卢昌海“稀有主页”的思考

稀有主页假设 (changhai.org) 看了您的“稀有主页”假设,觉得很有意思,有了一些思考。我总结现代人浏览网页大约有以下两种途径,通过搜索引擎或门户网站直接浏览 1.网状搜索视界:通过搜索一个信息可得出此信息相关的网页入口。以一个人感兴趣的全部信息作为隐含的搜索输入,而得出的全部搜索结果,又可以作为下次搜索的输入信息,最终形成一个庞大的信息网。我称这为“搜索视界”, 即一个人通过搜索引擎而可能浏览的网页集合。由于每个人兴趣不同,且网状视界需要花费时间(实际浏览网页)才能进行拓展与迭代,个人知识与浏览习惯差异可能造成每个人的搜索视界差异极大。 2.网状推送视界:同上面相似,当今的门户网站(youtube,微博等)多有推送机制,即不提供统一的信息,而通过用户喜好而单独提供不同的推送结果,以此产生不同的浏览视界。 要想发现“稀有主页”,必须有与其匹配的“视界”才行。且由于“个人主页”性质限制,不能依托于平台,只能通过第一种“搜索视界”发现。我就是通过搜索得到的信息而发现您的博客。而热爱网络记录的人可能更偏向阅读实体书籍或其他原因,搜索视界反而较小,而难以发现此类页面。现如今网络信息向平台化,精细化发展,有些甚至有“逆网络化”发展,分割信息的趋势,此类主页更加难以发现。 不过我仍抱乐观态度:网络化,虚拟化是前进方向,发展的生产力会促使更多的时间投入到个人表达创作上面,未来仍不乏向您一样优秀的创作者出现。 另:两个时间比较悠久的博客 最早的博客(始于。1994)links.net/vita/web/start/original.html 概念艺术家(始于2005,没有文字,但是很多创作的图,作者也是发表成书了的,发在博客内免费供观看) www.simonstalenhag.se/

对于存在与运动的思考

欢迎讨论碰撞:运动由不动做成?诸法不动,何以有运动现象?仁者心动?摘自《运动何以可能》 (douban.com)   也许同一个物体不能位于不同时刻。我们通常认为是同一个的物体,连续地存在于时间中,实际是一系列不同的物体(虽然非常相似),每一个在它们自己的时间里都是凝固不变的。   既然说是时刻,那么既是认为其为离散的点。 一、如果时刻之间无限可分,那么可以认定时间是连续的。 二、如果时刻之间有最小不可分的单位,那么这最小时刻之间必须存有全体形式的业力,以达到全体形式下一刻的“再现”。而此种时刻间的业力必在存在之内(若在存在之外,则存在不能凭借游离于存在之外的“业力”,产生出下一刻的全体形式)。 三、则对于全体形式而言,无法觉察此时刻间的业力(自身尚未生成)。且此种混沌内没有时间(没有形式存在,故而没有形式的变化,而时间必须有形式的变化作为考量)。因而从形式的角度,可以认定形式本身是连续的。 四、存在可以存在,但无法感知全体的存在。存在如果是绝对一体的,不变的,完全的,则一其不能感知,二这很无聊,因为什么也不会发生。为了打破这种虚无,存在发生了某种“虚假的分离‘,且保存了存在的整体性。从此存在变得对自己有觉知,存在觉知到存在自身的无限性。存在通过此种“虚假的分离”将自己分为主体和客体,创造了第一个幻觉。从此,存在被分成越来越具体的层次,好像细胞分裂一样。

Godot UI

Button按钮 set_pressed_no_signal(仅toggle mode下有效),设置button状态且不触发信号

Godot信号

 信号可以在代码中声明 signal node_ready signal weapon_shooted(damage) 第二种带有变量的声明除了可以在编辑器中看到之外,我没有发现有什么不同,信号发射时默认不带参数。 信号发射时,链接到的函数参数如果比信号参数少,则不能触发。但是函数参数更多且未传入的参数有默认值则可以触发 emit_signal("test_signal", "hello") func _ _on_test_signal_triggered(a, b = " world"):     print(a + b) 自带参数和bind的参数不同,bind参数自动发送,优先度在自带参数之后 注意bind的参数在绑定之后就不可更改了,即使参数已经发生了变化,仍旧发送最初的数值 自带参数可以用一个信号达成不同效果 bind可以同时绑定多个参数。 func _ready():      self.connect("test_signal", self, "_on_test_signal_triggered", ["default bind var"])      emit_signal("test_signal", "button pressed") func _on_test_signal_triggered(var1, var2): print(str(var1) + str(var2)) 输出button presseddefault bind var

从blender导出模型到Godot

Image
1) 导出格式为 gltf packed 2) shape keys 和 modifiers可能不能同时使用(冲突) 3) check modifiers if you have used them and turn off shape keys during export. 4) Uncheck keep materials in godot on consecutive reimports. Click on the button until it reimports properly or restart godot. 5) materials can be imported on per node level or model level

godot editor plugin入门

Image
新建插件 主要方法 ● bool handles(object: Object) virtual 如果插件编辑了一个特定类型的对象(资源或节点),就执行这个函数。 如果返回true,则编辑器请求时将调用edit()和make_visible()函数。 如果您已经声明了方法forward_canvas_gui_input()和forward_spatial_gui_input(),它们也将被调用。 使用plugin更改节点的export var后,可以手动调用edited_node.property_list_changed_notify()方法来更新编辑器的查看器。 生成节点 使用plugin生成节点并添加到当前编辑的场景中,需要将新node的owner设为get_tree().edited_scene_root或其他为packedscenen的父节点(owner即是其跟随保存的packedscene节点)。即否则不能保存到文件中,且在场景树查看器中无法看到。(但仍然可以在canvas editor或spatial editor中查看,但是不能选中,并且不能保存到文件内)

Godot 资源管理

Owner与PackedScene  owner 节点的所有者。 一个节点可以有任何其他节点作为owner(只要它是树中有效的父节点、以及父节点的上层)。 当保存一个节点(使用PackedScene)时,它拥有的所有节点都会被保存。 这允许创建复杂的SceneTrees,包括实例化和子实例化。 set_owner要在add_child()后使用 注意pack方法并不会保存子节点拥有的节点,即owner效果不能向上传递。如果将节点owner设为非父级的packedScene,则此节点及其所有子节点均不能保存到packedscene   将当前节点保存为场景文件 var pack = PackedScene.new() pack.pack(self) ResourceSaver.save("res://SceneTree/TestPack.tscn", pack)

Godot Autoload

Autoload(singleton)必须是基础自node的script或者是packedscene func add_autoload(name, resource):     var node     if resource is Script:         node = resource.new()     elif resource is PackedScene:         node = resource.instance()     else:         return     node.name = name     get_tree().get_root().add_child(node)     # node now exists at $/root/DialogueSystem

godot _set() _get()方法

What are the differences in using set and get vs just setting the variables straight - Godot Engine - Q&A GDScript's  _get() and  _set(): How and When to Use Them (jwestman.net) set(), get(), _set(), _get() 获取或更改变量 例如如果health变量并未声明,则 var new_health = health 语句会出错 而使用get("health")则会返回null。set()同理设置并不存在的属性则什么都不会发生 _get()和_set()则是覆盖方法,类似于setget,只不过写在一起,处理某些情况更为方便。比如更新player的属性: var health var energy var power func _set(property, value):     emit_signal("player_status_updated", {property:value}) _set(), _get()默认执行默认的数值设置和获取代码,所以 func _set(property, value):     print("do nothing!) 也是可以正常运行的。_set,_get内的代码只有在使用set(),get()时才会触发

Blogger自定义

免费主题: Free Blogger templates - BTemplates   Latest Free Templates (gooyaabitemplates.com) 可选的主题定制器 Blogger Editor - Customize your Blogger layouts! - Pimp-My-Profile.com

Godot get_property_list

enum PropertyHint {     PROPERTY_HINT_NONE, ///< no hint provided.     PROPERTY_HINT_RANGE, ///< hint_text = "min,max,step,slider; //slider is optional"     PROPERTY_HINT_EXP_RANGE, ///< hint_text = "min,max,step", exponential edit     PROPERTY_HINT_ENUM, ///< hint_text= "val1,val2,val3,etc"     PROPERTY_HINT_EXP_EASING, /// exponential easing function (Math::ease) use "attenuation" hint string to revert (flip h), "full" to also include in/out. (ie: "attenuation,inout")     PROPERTY_HINT_LENGTH, ///< hint_text= "length" (as integer)     PROPERTY_HINT_SPRITE_FRAME, // FIXME: Obsolete: drop whenever we can break compat. Keeping now for GDNative compat.     PROPERTY_HINT_KEY_ACCEL, ///< hint_text= "length" (as integer)     PROPERTY_HINT_FLAGS, ///< hint_text= "flag1,flag2,etc" (as bit flags)     PROPERTY_HINT_LAYERS_2D_RENDER,     PROPERTY_HINT_LAYERS_2D_PHYSIC...

Krita更改lineart线宽

Image
  Thickness of stroke - Support and Advice / Beginner's Questions - Krita Artists (krita-artists.org) 添加白色背景 -> blur/gaussian blur(模糊) -> Threshold (更改线宽)-> Blur(再次模糊以减少锯齿) ->Mean Removal(抵消上步的模糊)-> Color to Alpha(透明化线条)

Krita笔刷设置

 Opacity 和 Flow: Opacity在连续绘制内(不抬笔)时叠加不会超过透明度(最大透明度为此时的opacity,如果设置了跟随笔压,则最大透明度是笔压-透明度曲线设置的最大值) Flow在连续绘制内可以无限叠加透明度到100% 自定义笔刷icon: 打开笔刷kpp文件,直接绘制更改即可,或自己绘制笔刷icon库使用(200x200px) 传感器sensor Sensors — Krita Manual 5.0.0 documentation 压力 Pressure 压感笔的压力变化,包括压力的增大和减小 压力 (仅增大) PressureIn 只感应压感笔的压力增大数值,无视压力减小数值。这意味着在绘制一道笔画的过程中,压力只能增大,不能减小,直至压感笔离开数位板为止。 X 轴倾斜 X-tilt 压感笔笔身的倾斜角度。不是所有压感笔都有此传感器。 Y 轴倾斜 感应压感笔笔身的倾斜角度。不是所有压感笔都有此传感器。 笔身指向 Tilt-direction 感应压感笔的笔身指向。笔身向 12 点钟方向倾斜时 (笔尖指向执笔者) 为 0°,笔身顺时针旋转 90° 时为 +90°,笔身逆时针旋转 90° 时为 -90°,角度在 -180° 到 +180° 的区间变化。 笔身倾角 Tilt-elevation 感应压感笔的笔身倾角。0° 为笔身平放,90° 为笔身直立。 速度 Speed 感应压感笔的绘制速度。 笔画方向 Drawing Angle 感应笔画的方向。勾选 锁定角度Lock 后,笔画方向将被锁定为每笔开始时的角度。勾选 转角平滑Fan Corners 后,传感器将尝试在笔画转弯对转角处的角度进行平滑。它的滑动条可以控制平滑的阈值角度。 角度偏移 Angle Offset 滑动条可以为当前角度附加一定的偏移量。 笔身旋转 Rotation 感应压感笔笔身的旋转。不是所有压感笔都有此传感器。 距离 Distance 感应笔刷移动的距离。距离以像素为单位计算。默认勾选“循环”选项,会在到达设定最大值后重新开始计算距离。 时间 Time 感应笔刷开始绘制后的时间长度。 随机度 (笔尖印迹) Fuzzy (Dab) 输出一定的随机度,此项对一条笔画内部的每个笔尖印迹生效。此传感器就是一般意义上的“随机”。 随机度 (笔画) Fuzzy Stroke ...

blender shader node入门

Data types Cycles - (Shader) Nodes - inputs outputs - What are the exact data types? - Blender Stack Exchange ‎浅绿色‎‎插座代表‎‎closure‎‎闭包。它们不具有任何特定值,它们用于指示渲染应如何处理光线。可以添加和混合‎‎瓶盖‎‎(这是混合瓶盖颜色的"添加"操作)。‎‎闭包‎‎是‎‎确定从周围环境到入射矢量方向的反射光量的函数,它们通常乘以颜色。它们还可以使用 OSL 转换为字符串。‎ ‎紫色‎‎套接字表示‎‎矢量‎‎。它们有三个分量,分别用于 X、Y 和 Z。它们可以用作矢量、点、法线或可由 3 个分量表示的任何类型的数据(它们甚至可以表示颜色)。‎ ‎黄色‎‎插座代表‎‎颜色‎‎。它们类似于紫色插座,它们也有3个组件(红色,绿色和蓝色),但它们被视为颜色,通常,转换是在色彩空间中完成的。例如,将颜色插入值套接字时,颜色将转换为灰度,并用作单个值(val=R*0.2989 + G*0.5870 + B*0.1140);但是,如果我们用相同的值(val= (X + Y + Z)/3)填充矢量而不是颜色,则此值将有所不同。‎ ‎浅灰色‎‎插座表示‎‎单个值‎‎。就像0.0,1.0,0.5,-5.5,3.1415等。‎ ‎深绿色‎‎插座表示‎‎整数‎‎ (-2, -1, 0, 1, 2,...)‎ ‎白色‎‎(在新版本中为深灰色)套接字虽然不常见,但通常代表 ‎‎String。‎‎它们并不常见,只能与 OSL 一起使用。‎ ‎除‎‎闭包‎‎、‎‎整数‎‎和‎‎字符串外‎‎,所有其他套接字组件都是‎‎浮点‎‎值(甚至整数也转换为浮点值,因为 SVM 仅使用这些值)。‎ ‎现在,套接字表示信息的输入/输出。人们如何使用这些信息远远超出了在一个简单的答案中给出的可能性,因为每个值都可以根据它们使用的上下文具有不同的含义。例如,值 0.8 可以表示任何值(粗糙度值、IOR 值、角度等)。由用户为这些值提供上下文。‎ ‎另一点是:不要以为值真的从一个套接字传递到另一个套接字。节点树在发生任何更改后都会被分析,SVM 会在后台编译工作版本。您在节点中拥有的只是一个接口。‎

Blender node材质合集

Image
 伪各项异性(eevee)