M3G Specification中已有了详细的说明,根据权值对Mesh做简单的变形:
Denoting the base mesh with B, the morph targets with Ti, and the weights corresponding to the morph targets with wi,
the resultant mesh R is computed as follows:
-
R = B + sum [ wi (Ti - B) ]
我们只要做简单的变化,
R = B + sum[ wi (Ti - B)]
= B + sum(wi * Ti ) - sum(wi * B)
= [1 - sum(wi )] * B + sum(wi * Ti )
这样就容易理解,根据上式也很容易编码。
==============
Kemulator中,是在每次渲染前,根据上式计算出对应的Mesh,如果顶点数比较多,则需要消耗一定的计算时间。
假如遇到有的手机对Morphing Mesh渲染比较慢,就可以考虑自己封装一个Morphing的实现,
当Mesh需要改变时才计算新的mesh,渲染时就不需要额外的计算了。
April 12, 2007
Pos3D to Pos2D in M3G
to 大河马~~
Camera m_camera; //current camera
Transform m_camTransform; //current camera transform
Transform m_objTransform; //transform of the render obj
void Pos3D2Pos2D(float[] pos3D, float[]pos2D)
{
float pos[] = new float[]{pos3D[0], pos3D[1], pos3D[2], 1}
//get current position
m_objTransform.transform(pos);
//apply camera transform
Transform invTrans = new Transform(m_camTransform);
invTrans.invert();
invTrans.transform(pos);
//get z
float z = -pos[2];
float x = 0;
float y = 0;
//projection
Transform transProjection = new Transform();
camera.getProjection(transProjection);
transProjection.transform(pos);
// NDC to View
x = pos[0] * getWidth()/ (2 * z);
y = pos[1] * getHeight()/ (2 * z);
//convert to screen pos.
pos2D[0] = (int)(getWidth()/2 + x);
pos2D[1] = (int)(getHeight()/2 - y);
}
January 31, 2007
Camera In JSR184
1.Camera类
— Lyo Wu
写完模拟器的M3G部分,早就想写点总结,不写怕要忘了。
那就从最简单的Camera类开始。
Camera类封装了3种投影变换:Generic、Parallel、Perspective。
1)Generic
public void setGeneric(Transform transform)
直接指定一个变换矩阵(Transform类其实就是一个矩阵的封装),可以根据需求任意设置投影矩阵。
2)Parallel
public void setParallel(float fovy, float aspectRatio, float near, float far)
平行投影(正射投影,Orthographic Projection),忽略z轴作用,投影后的物体大小尺寸不变。M3G Specification中已经给出了对应的矩阵(NDC坐标系):
| 2/w 0 0 0 |
| 0 2/h 0 0 |
| 0 0 -2/d -(near+far)/d |
| 0 0 0 1 |
其中,fovy - height of the view volume in camera coordinates。
h = height (= fovy)
w = aspectRatio * h
d = far - near
公式推导:
设(x, y, z, w)为视点坐标,(x’, y’, z’, w’)为投影坐标,(Px, Py, Pz, Pw)为NDC。
近平面距离为n,远平面距离为f,视口宽为w,高为h。
x’ = x
y’ = y
映射到NDC ([-1, 1]),
Px = 2 * x’/ w = 2 * x / w
Py = 2 * y’ / h = 2 * y / h
由于z坐标投影后不参与绘图,用于可见性判断,只要保证Pz与z呈线性关系,即Pz=a*z+b
将(-n,-1), (-f, 1) 代入得
a = -2 / (f - n)
b = -(n + f) / (f - n)
Pz = -2/ (f - n)*z - (n + f) / (f - n)
即等价于
| x || 2/ w 0 0 0 |
| y | | 0 2 / h 0 0 |
| z | * | 0 0 -2/ (f – n) -( n + f) / (f - n)|
| 1 | | 0 0 0 1 |
3)Perspective
public void setPerspective(float fovy, float aspectRatio, float near, float far)
透视投影,即离视点近的物体大,离视点远的物体小,符合人们心理习惯。
M3G Specification中已经给出了对应的矩阵(NDC坐标系):
| 1/w 0 0 0 |
| 0 1/h 0 0 |
| 0 0 -(near+far)/d -2*near*far/d |
| 0 0 -1 0 |
其中,fovy - field of view in the vertical direction, in degrees。
h = tan ( fovy/2 )
w = aspectRatio * h
d = far - near
公式推导:
设(x, y, z, w)为视点坐标,(x’, y’, z’, w’)为投影坐标,(Px, Py, Pz, Pw)为NDC。
近平面距离为n,远平面距离为f,近平面宽为W,高为H。
由相识三角形可以得到
x’ = -n * x / z
y’ = -n * y / z
映射到NDC ([-1, 1]),可得
Px = x’/ (W/2) = -2*n*x / z * W
Py = y’/ (H/2) = -2*n*y / z * H
由于x’, y’与1/ z有线性关系,只要保证Pz与1/z呈线性关系,即Pz=a/z+b
将(-n,-1), (-f, 1) 代入得
a = 2*n*f / f - n
b = f + n / f – n
Pz = 2*n*f / (f - n)*z + (f+n) / (f - n)
由于最后会除以w分量,所以可以把共同项写入w分量:
-zPx = 2*n*x / W
-zPy = 2*n*y / H
-zPz = -2*n*f / (f – n) - (f+n) / (f - n) * z
w = -z
即等价于
| x || 2*n / W 0 0 0 |
| y | | 0 2*n / H 0 0 |
| z | * | 0 0 - (f+n) / (f - n) -2*n*f / (f – n)|
| 1 | | 0 0 -1 0|
引入视角fovy,即:
h = tan ( fovy/2 ) = (H/2) / n = H / 2*n
w = aspectRatio * h = W / 2*n
d = f - n
=============
December 9, 2006
M3G API beta
After monthes coding… the M3G APIs have alomost been implemented in my KEmulator.
next, i will make a general review.
相关推荐
Lyo 提供将Node.js模块发布为与浏览器兼容的库的最简单方法
LYO CSS小框架是一款轻量级的前端样式库,专为快速构建响应式网页设计而设计。它由“莱欧”开发,旨在提供简洁、易用的CSS工具集,帮助开发者节省时间,提高效率,同时保持代码的整洁和可维护性。在这款框架中,你...
LYO-26冻干机作为一款应用于医药行业的关键设备,其再验证方案是确保设备性能符合标准的重要过程。该方案不仅涉及设备的安装、运行、性能等多个环节,还规定了验证周期和验证报告的批准流程,体现了对质量控制的严格...
首先当然是下载:http://lyo.blogsome.com/kemulator/ ,这里是使用说明http://lyo.blogsome.com/kemulator/manual,作者Lyo对于如何将这个模拟器整合进eclipse已经做了详细描述。目前KEmulator支持的API包括: ...
Eclipse Lyo OSLC 测试套件 需要改进的方面 介绍 目标 OSLC 测试套件是一组 JUnit 测试,可通过 Eclipse Lyo 项目使用。 它旨在针对 OSLC 服务提供商(在特定领域,例如 CM、QM 和 RM)进行测试,以了解其对 OSLC...
《Visual C++ 开发经验技巧宝典》.pdf by 深流水静水流深 打开密码:hardworkhacker@163.com
Node.js到浏览器-简单的方法Lyo是将Node.js模块...Lyo使用,,和少量的魔法:sparkles:,所以你不必担心配置安装和运行#安装全球i -g lyo#运行(在你自己的模块上)lyo#运行(在任何npm模块上)lyo得到模块> <Lyo将创造
《Simulink OSLC适配器:Java技术在模型集成中的应用》 Simulink OSLC适配器是一款专为模型集成设计的工具,主要用于连接Simulink模型与其他支持OSLC(Open Services for Lifecycle Collaboration)标准的系统。...
变更18/3/2021 为媒体添加了uuid步骤 页面头盔已添加 变化 更改了几个按钮的颜色 导航栏的布局已更改 为按钮添加了图标,以获得更好的用户体验 更改主页布局 安装(主文件夹) npm我要安装所有依赖项 ...
首先当然是下载:http://lyo.blogsome.com/kemulator/ ,这里是使用说明http://lyo.blogsome.com/kemulator/manual,作者Lyo对于如何将这个模拟器整合进eclipse已经做了详细描述。目前KEmulator支持的API包括: ...
Github:https://github.com/Lyo-hub/wxpy_AddFriend 本程序为基于wxpy库实现的。 1.打开cmd导入一下库。 2.修改库文件中add_friend函数,将状态更改为3。... 您可能感兴趣的文章:wxPython:pyth
Lyo Javascript客户端版本0.1: 这是OSLC javascript客户端的初始版本,可用于与启用了OSLC的工具(如Rational Team Concert,Rational Quality Manager,ClearQuest和Bugzilla Lyo Adapter)进行交互。 在此版本中...
2. **Project Lyo SDK**:Project Lyo 提供了一个基于 OSLC 的 SDK,为开发者构建适配器提供了坚实的基础。 3. **社区参与**:IBM Rational 鼓励社区成员参与进来,共同开发适配器,并分享最佳实践和技术资源。 #...
- Y6II LYO-L01 - Y7 2018 LDN-LX3 - Y7 2018伦敦LDN-L03 - Y7 Prime - Y7 Prime TRT-L53 - Y7 Prime TRT-TL00 - Y7 TRT-LX2 - Y9 2018 LX1 - Y9 2018 LX2 - Y9 2018 LX3 - 如果此处未列出您的型号,请...
近年来,IBM继续推动开源技术的发展,对KVM、oVirt和Open Virtualization Alliance的支持,以及对Apache Shindig、Apache Hadoop(作为IBM BigInsights的一部分)、Eclipse Orion、Lyo、Paho、OpenJDK、Apache ...
对于类似"ゃゅょ"的小写元音"ァィゥェォ",可以通过在前面加上"L"来输入,如"LYA"、"LYU"、"LYO"。 总之,掌握日语输入法的基本要领对于日语初学者来说十分重要。通过熟悉各种音节的输入规则,能够更加流畅地输入...
NGUI 是一个针对 Unity 3D 游戏引擎的用户界面(UI)系统,它为开发者提供了丰富的工具和组件,以便在游戏项目中创建复杂的交互式界面。版本 3.12.1 是 NGUI 的一个重要里程碑,因为它代表了这个库的最新稳定更新,...
FBDigitalFont是一款开源的iOS开发库,由lyo.kato在GitHub上发布,并遵循MIT许可协议。该项目旨在为iPhone应用提供一种独特、富有创意的文字显示方式,模拟LED灯或电子表的视觉效果,为用户界面增添一种科技感和趣味...
FBGlowLabel是一款适用于iOS开发的开源库,它是由开发者lyo.kato在GitHub上发布并遵循MIT许可证的。这个库的主要功能是为UILabel的文字添加动态的光晕效果,为UI设计增添更多视觉吸引力。在iOS应用中,我们通常使用...