`
izuoyan
  • 浏览: 9222187 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lyo blog3D文章集锦

阅读更多

lyo blog关闭了,好文章做个备份

---------------------------------------

Skinned Mesh in M3G

Filed under: Programming

Skinned Mesh,就是根据skeleton去变换顶点,通过addTransform函数将Vertex和bone绑定,Specification中给出了计算式子:

Denote the set of nodes (bones) associated with a vertex by { N1, N2, …, NN }.
Denote by Mi the transformation from the local coordinate system of node Nito a reference coordinate system.
The choice of the reference coordinate system is not critical; depending on the implementation,
good choices may include the world coordinate system, the coordinate system of the SkinnedMesh node,
or the coordinate system of the current camera. Finally, let us denote the weight associated with node Ni as Wi.
The blended position of a vertex in the reference coordinate system is then:

    v‘ = sum [ wiMiBiv ]

其中,

  • 0 <= i < N, 其中N 是和顶点v 关联的bone个数;
  • v 是VertexBuffer中初始的顶点位置;
  • Bi是"at rest"变换,即从SkinnedMesh到顶点bone的初始变换矩阵,可以用Node.getTransformTo(bone, transform)取得;
  • Mi当前顶点bone到参考坐标系的变换矩阵,我们取SkinnedMesh的坐标系,这样得到的是一个标准的Mesh,方便调用渲染;
  • wi is the normalized weight of bone Ni, computed as wi = Wi / (W1 + … + WN).

Bi在addTransform时,就可以得到,而Mi则需要在渲染时获取,bone.getTransformTo(skinnedMesh, Mi) ,
注意对应的Normal变换有点不一样,不是直接的用Mi ,而需要用对应的inverse transpose矩阵:

n‘ = sum [ wi (Mi * Bi)-1Tn ]

Morphing Mesh in M3G

Filed under: Programming

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

Filed under: Programming

to 大河马~~emoticon

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

Filed under: Programming

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

Filed under: Programming

After monthes coding… the M3G APIs have alomost been implemented in my KEmulator.

next, i will make a general review.

m3g classes


分享到:
评论

相关推荐

    Node.js-Lyo提供将Node.js模块发布为与浏览器兼容的库的最简单方法

    Lyo 提供将Node.js模块发布为与浏览器兼容的库的最简单方法

    lyo:LYO CSS小框架

    LYO CSS小框架是一款轻量级的前端样式库,专为快速构建响应式网页设计而设计。它由“莱欧”开发,旨在提供简洁、易用的CSS工具集,帮助开发者节省时间,提高效率,同时保持代码的整洁和可维护性。在这款框架中,你...

    Kemulator 手机游戏模拟器

    首先当然是下载:http://lyo.blogsome.com/kemulator/ ,这里是使用说明http://lyo.blogsome.com/kemulator/manual,作者Lyo对于如何将这个模拟器整合进eclipse已经做了详细描述。目前KEmulator支持的API包括: ...

    lyo.testsuite:Lyo 项目存储库 (lyo.testsuite)

    Eclipse Lyo OSLC 测试套件 需要改进的方面 介绍 目标 OSLC 测试套件是一组 JUnit 测试,可通过 Eclipse Lyo 项目使用。 它旨在针对 OSLC 服务提供商(在特定领域,例如 CM、QM 和 RM)进行测试,以了解其对 OSLC...

    LYO-26冻干机再验证方案[参照].pdf

    LYO-26冻干机再验证方案是针对上海东富龙科技有限公司生产的真空冷冻干燥机进行的一项重要质量控制活动,旨在确保设备在使用过程中的性能稳定和合规性。冻干机主要用于医药行业的冻干粉针生产,具备国内先进技术水平...

    VC++开发经验技巧宝典电子书.pdf(第16章).pdf

    《Visual C++ 开发经验技巧宝典》.pdf by 深流水静水流深 打开密码:hardworkhacker@163.com

    lyo::package:Node.js到浏览器-简单的方法

    Node.js到浏览器-简单的方法Lyo是将Node.js模块...Lyo使用,,和少量的魔法:sparkles:,所以你不必担心配置安装和运行#安装全球i -g lyo#运行(在你自己的模块上)lyo#运行(在任何npm模块上)lyo得到模块&gt; &lt;Lyo将创造

    lyo.adapter-simulink:lyo.adapter-simulink

    《Simulink OSLC适配器:Java技术在模型集成中的应用》 Simulink OSLC适配器是一款专为模型集成设计的工具,主要用于连接Simulink模型与其他支持OSLC(Open Services for Lifecycle Collaboration)标准的系统。...

    firebase-lyo4

    变更18/3/2021 为媒体添加了uuid步骤 页面头盔已添加 变化 更改了几个按钮的颜色 导航栏的布局已更改 为按钮添加了图标,以获得更好的用户体验 更改主页布局 安装(主文件夹) npm我要安装所有依赖项 ...

    KEmulator最新版模拟器0.9.8

    首先当然是下载:http://lyo.blogsome.com/kemulator/ ,这里是使用说明http://lyo.blogsome.com/kemulator/manual,作者Lyo对于如何将这个模拟器整合进eclipse已经做了详细描述。目前KEmulator支持的API包括: ...

    Python 基于wxpy库实现微信添加好友功能(简洁)

    Github:https://github.com/Lyo-hub/wxpy_AddFriend 本程序为基于wxpy库实现的。 1.打开cmd导入一下库。 2.修改库文件中add_friend函数,将状态更改为3。... 您可能感兴趣的文章:wxPython:pyth

    oslc-js-client

    Lyo Javascript客户端版本0.1: 这是OSLC javascript客户端的初始版本,可用于与启用了OSLC的工具(如Rational Team Concert,Rational Quality Manager,ClearQuest和Bugzilla Lyo Adapter)进行交互。 在此版本中...

    IBM Rational OSLC Adapter for Atlassian JIRA

    2. **Project Lyo SDK**:Project Lyo 提供了一个基于 OSLC 的 SDK,为开发者构建适配器提供了坚实的基础。 3. **社区参与**:IBM Rational 鼓励社区成员参与进来,共同开发适配器,并分享最佳实践和技术资源。 #...

    Huawei FRP Lock Remove Tool 2018

    - 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 - 如果此处未列出您的型号,请...

    企业级Linux与Power开源解决方案.pptx

    近年来,IBM继续推动开源技术的发展,对KVM、oVirt和Open Virtualization Alliance的支持,以及对Apache Shindig、Apache Hadoop(作为IBM BigInsights的一部分)、Eclipse Orion、Lyo、Paho、OpenJDK、Apache ...

    日语初学者的日语输入法基本要领

    对于类似"ゃゅょ"的小写元音"ァィゥェォ",可以通过在前面加上"L"来输入,如"LYA"、"LYU"、"LYO"。 总之,掌握日语输入法的基本要领对于日语初学者来说十分重要。通过熟悉各种音节的输入规则,能够更加流畅地输入...

    NGUI3.12.1

    NGUI 是一个针对 Unity 3D 游戏引擎的用户界面(UI)系统,它为开发者提供了丰富的工具和组件,以便在游戏项目中创建复杂的交互式界面。版本 3.12.1 是 NGUI 的一个重要里程碑,因为它代表了这个库的最新稳定更新,...

    FBDigitalFont(iPhone源代码)

    FBDigitalFont是一款开源的iOS开发库,由lyo.kato在GitHub上发布,并遵循MIT许可协议。该项目旨在为iPhone应用提供一种独特、富有创意的文字显示方式,模拟LED灯或电子表的视觉效果,为用户界面增添一种科技感和趣味...

    FBGlowLabel(iPhone源代码)

    FBGlowLabel是一款适用于iOS开发的开源库,它是由开发者lyo.kato在GitHub上发布并遵循MIT许可证的。这个库的主要功能是为UILabel的文字添加动态的光晕效果,为UI设计增添更多视觉吸引力。在iOS应用中,我们通常使用...

Global site tag (gtag.js) - Google Analytics