MUL

Unity3D法线转换与切线空间总结

空扰寡人 提交于 2020-03-23 20:48:40
3 月,跳不动了?>>> 本篇为大家总结了Unity3D中的法线转换与切线空间知识。在Shader编程中经常会使用一些矩阵变换函数接口,其实它就是把固定流水线中的矩阵变换转移到了可编程流水线或者说GPU中,先看下面的函数语句: // Transform the normal from object space to world space o.worldNormal = mul(v.normal, (float3x3)_World2Object); 在这里先给大家介绍一下,为何使用此函数,模型的顶点法线是位于模型空间下的,因此我们首先需要把法线转换到世界空间中。计算方式可以使用顶点变换矩阵的逆转置矩阵对法线进行相同的变换,因此我们首先得到模型空间到世界空间的变换矩阵的逆矩阵_World2Object,然后通过调换它在mul函数中的位置,得到和转置矩阵相同的矩阵乘法。由于法线是一个三维矢量,因此我们只需要截取_World2Object的前三行前三列即可。下面给大家展示变换Shader代码。 由于光源方向、视角方向大多都是在世界空间下定义的,所以问题就是如何把它们从世界空间变换到切线空间下。我们可以先得到世界空间中切线空间的三个坐标轴的方向表示,然后把它们按列摆放,就可以得到从切线空间到世界空间的变换矩阵,那么再对这个矩阵求逆就可以得到从世界空间到切线空间的变换: /// ///

区块链100讲:深入了解以太坊虚拟机的汇编代码基础

五迷三道 提交于 2020-02-28 15:57:04
Solidity提供了很多高级语言的抽象概念,但是这些特性让人很难明白在运行程序的时候到底发生了什么。我阅读了Solidity的文档,但依旧存在着几个基本的问题没有弄明白。 string, bytes32, byte[], bytes之间的区别是什么? 该在什么地方使用哪个类型? 将 string 转换成bytes时会怎么样?可以转换成byte[]吗? 它们的存储成本是多少? EVM是如何存储映射( mappings)的? 为什么不能删除一个映射? 可以有映射的映射吗?(可以,但是怎样映射?) 为什么存在存储映射,但是却没有内存映射? 编译的合约在EVM看来是什么样子的? 合约是如何创建的? 到底什么是构造器? 什么是 fallback 函数? 我觉得学习在以太坊虚拟机(EVM)上运行的类似Solidity 高级语言是一种很好的投资,有几个原因: Solidity不是最后一种语言。更好的EVM语言正在到来。(拜托?) EVM是一个数据库引擎。要理解智能合约是如何以任意EVM语言来工作的,就必须要明白数据是如何被组织的,被存储的,以及如何被操作的。 知道如何成为贡献者。以太坊的工具链还处于早期,理解EVM可以帮助你实现一个超棒的工具给自己和其他人使用。 智力的挑战。EVM可以让你有个很好的理由在密码学、数据结构、编程语言设计的交集之间进行翱翔。 在这个系列的文章中

mysql中查询表和字段注释

安稳与你 提交于 2020-02-26 05:32:43
查看所有表的注释 SQL: SELECT table_name 表名,table_comment 表说明 FROM information_schema.TABLES WHERE table_schema = 'moneta' ORDER BY table_name 结果: MySQL [moneta]> SELECT table_name 表名,table_comment 表说明 FROM information_schema.TABLES WHERE table_schema = 'moneta' ORDER BY table_name; +--------------------+--------------------------+ | 表名 | 表说明 | +--------------------+--------------------------+ | biz_rule | 业务规则表 | | biz_rule_action | 业务规则动作表 | | biz_rule_condition | 业务规则条件表 | | buyer_tag | 买家标签表 | | query | 用户query表 | | store_rule_group | 店铺业务规则组表 | +--------------------+--------------------------+ 6

Java中对于位运算的优化以及运用与思考

为君一笑 提交于 2020-01-08 19:16:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 引言 随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码。之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候考虑内存的限制优先于处理器),所以很多时候,利用位运算来节约空间或者提高性能,那么这些优秀的思想,放到目前的Java中,是否还有必要这么做呢?我们逐一思考与验证下(其实这也是一个关于Premature optimization的界定的思考) 1. 乘法与左移位 左移一位,相当于乘以2,左移n位,相当于乘以2的n次方。 1 << 1 == 1 * 2 //true 1 << n == 1 * pow(2, n) // true public int pow(int i, int n) { assert n >= 0; int result = 1; for (int i = 0; i < n; i++) { result *= i; } return result; } 看上去,移位应该比乘法性能快。那么JIT与JVM虚拟机是否做了一些优化呢?优化分为两部分,一个是编译器优化,另一个是处理器优化。我们先来看看字节码是否一致判断是否有编译优化,例如直接将乘以2优化成左移一位,来编写两个函数: public void

反复横跳的瞄准线!从向量计算说起!基于射线检测的实现!Cocos Creator!

a 夏天 提交于 2019-12-16 19:30:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> > 最近有小伙伴问我瞄准线遇到各种形状该怎么处理?如何实现反复横跳的瞄准线?最近刚好在《Cocos Creator游戏开发实战》中看到物理系统有一个射线检测,于是,基于这个射线检测,写了一个反复横跳的瞄准线效果。一起往下看吧!文章底部获取完整项目! 国际惯例,先上最终效果! 在讲解之前我们需要一些向量的知识,简单的介绍一些吧! 向量的加法, OA + AB = OB 向量的点乘,表示一个向量在另一个向量上的投影,是个标量,有正负之分。向量夹角小于 90度 为正数,等于 90度 为 零,大于 90度 为负数。 向量的叉乘,结果为向量,正好垂直于两个向量构成的平面(右手系),也称为法向量。这里暂时没用到,顺便提一下。 接下来进入正题,已知入射向量(单位向量),法向量(单位向量),如何得出反射向量? 我们将反射向量平移至入射向量起点,延长法向量与其相交,这个延长线的长度,刚好是 入射向量在法向量上的投影的相反数的两倍 。再根据投影和向量加法可以推出反射向量的计算公式。 清楚了么?不清楚也没关系,记得最后的公式就可以了,接下来进入 cocos creator 操作环节。 既然是物理系统中的碰撞检测,我们在编辑器里添加的是物理系统中的碰撞器,而不是引擎的碰撞器,不要选错了哦。 不动的刚体类型设为 static

ubuntu上编译和使用easy_profiler对C++程序进行性能分析

一个人想着一个人 提交于 2019-12-11 08:37:41
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文首发于个人博客 https://kezunlin.me/post/91b7cf13/ ,欢迎阅读最新内容! tutorial to compile and use esay profiler with c++ on ubuntu 16.04 <!--more--> Guide compile git clone https://github.com/yse/easy_profiler.git cd easy_profiler && mkdir build && cd build && cmake-gui .. make -j8 sudo make install usage CMakeLists.txt find_package(easy_profiler REQUIRED) #easy_profiler_Dir /usr/local/lib/cmake/easy_profiler target_link_libraries(my_application easy_profiler) code #include <easy/profiler.h> void foo() { EASY_FUNCTION(profiler::colors::Magenta); // Magenta block with name

使用opencv和numpy实现矩阵相乘和按元素相乘 matrix multiplication vs element-wise multiplication

我只是一个虾纸丫 提交于 2019-12-10 09:06:51
本文首发于个人博客 https://kezunlin.me/post/1e37a6/ ,欢迎阅读最新内容! opencv and numpy matrix multiplication vs element-wise multiplication <!--more--> Guide opencv Matrix multiplication is where two matrices are multiplied directly. This operation multiplies matrix A of size [a x b] with matrix B of size [b x c] to produce matrix C of size [a x c] . In OpenCV it is achieved using the simple * operator: C = A * B // Aab * Bbc = Cac Element-wise multiplication is where each pixel in the output matrix is formed by multiplying that pixel in matrix A by its corresponding entry in matrix B. The input matrices

JavaScript中的柯里化(Currying in JavaScript)[翻译]

霸气de小男生 提交于 2019-12-09 23:44:59
原文来自 Currying in JavaScript(https://blog.bitsrc.io/understanding-currying-in-javascript-ceb2188c339) 函数式编程是一种将函数作为参数来传递和返回的,并且没有副作用(只是返回新的值,不改变系统变量)的编程方式。所以很多语言采纳了这种编程方式,这里面JavaScript、Haskell、Clojure·、Erlang和Scala是最受欢迎的。 并且由于它能够传递和返回函数,它也带来了许多概念: 纯函数(Pure Functions) 柯里化(Currying) 高阶函数(Higher-order functions) 在这里我们要来探索的一个概念是柯里化(Currying)。 在本文中,我们将来了解柯里化是如何工作的,并且在开发过程中有何用途。 | 什么是柯里化 柯里化是把接受多个参数的函数转换成接受单一参数的函数的操作。它返回接受余下的参数而且返回结果的新函数。 它持续地返回一个新函数直到所有的参数用尽为止。这些参数全部保持“活着”的状态(通过闭包),然后当柯里化链中的最后一个函数被返回和执行时会全部被用来执行。 Currying is the process of turning a function with multiple arity into a function with

java BigDecimal 和DecimalFormat用法

旧城冷巷雨未停 提交于 2019-12-09 15:07:19
java.math.BigDecimal BigDecimal类型(+ - * /)所用的属性 11.10 BigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示。 表11-15 BigDecimal类的常用方法 序号 方 法 类型 描 述 1 public BigDecimal(double val) 构造 将double表示形式转换 为BigDecimal 2 public BigDecimal(int val) 构造 将int表示形式转换为 BigDecimal 3 public BigDecimal(String val) 构造 将字符串表示 形式转换为BigDecimal 4 public BigDecimal add(BigDecimal augend) 普通 加法 5 public BigDecimal subtract(BigDecimal subtrahend) 普通 减法 6 public BigDecimal multiply(BigDecimal multiplicand) 普通 乘法 7 public BigDecimal divide

一道神奇的Python面试题,你会吗?

北城余情 提交于 2019-12-06 19:22:10
关注公众号:「 Python专栏 」,后台回复「 爬虫书籍 」,即可获得2本Python爬虫相关的电子书 无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun(): temp = [lambda x : i*x for i in range(4)] return temp for everyLambda in testFun(): print (everyLambda(2)) 脑中默默一想,这还用说么,肯定是: 0 2 4 6 最后一看答案,竟然是: 6 6 6 6 于是带着怀疑的心态(其实是不服输,不认错),打开编辑器,快速一敲,果然是: 怀疑了人生半天,本来还想黑,WTF Python…然后才想通是自己太生疏...... 最后发现原因竟是:Python 的闭包的后期绑定导致的 late binding。 这意味着在闭包中的变量是在内部函数被调用的时候被查找,所以当任何 testFun() 返回的函数被调用,i 的值是在它被调用时的周围作用域中查找。 也就是说无论哪个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回的函数 testFun 的值都是 3。 因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x 2)。 究竟如何才能实现出这样的结果呢? 0 2 4 6 想了想,若能立即绑定参数