植物风场运动模拟(Wind Animations for Trees)

提要

植物的运动模拟是图形学中的一个方向,今天就来讨论下怎么模拟出一个在风中荷叶。

植物力学模型

由于植物的模型在风中会有大变形的情况存在,这里采用的是有限元模拟的方法来实现。

关于基于有限元的物理模拟,可以参考:

有限单元法(The Finite Element Method)

专注网格剖分 - TetGen,NETGEN,Steller

在基于有限元物理模拟中,速度是最大的缺点,特别在四面体特别多的情况下,现在的配置比较不错的电脑(i7+GTX680)加上GPU计算的代码,可以接受的情况是小于10000个四面体的情况,但是对于荷花这样比较精细和复杂的模型就很难做到小于10000个的四面体,这时候就需要用到插值技术,就是在精细模型的外面套一层粗糙的四面体,预处理出精细模型到外层四面体的插值矩阵,有限元的模拟用粗糙的四面体来进行,在模拟的同时,将四面体的位置插值回精细的模型,这样就可以在保证运行速度的情况下得到模拟复杂模型的相对精确的结果。下面就是VegaFEM中自带的乌龟模拟的例子:

植物的话,首先要在建模软件中建立植物的模型,和包围体,然后用细分软件对包围体进行四面体划分,之后就可以加载到模拟程序中了。

关于插值矩阵的计算可以参考VegaFEM自带的手册,VegaFEM里面也自带了一个计算矩阵的工具generateInterpolationMatrix,使用的方法是

./generateInterpolationMatrix mesh.veg finemesh.obj inter_mat.txt

生成的插值矩阵就在inter_mat.txt里了。

风场定义

可以用一个解析式来定义一个风场,

v = G(x, t)

其中x为空间的一个坐标 (x,y,z) , v表示风在 x 处的向量。

这里的风的大小是一个和时间相关的函数,这里就简单地用sin函数来表示。

在配置文件里定义两个变量,一个是double型的strength表示风的强度,还有一个direction变量表示风的方向。

受力计算

风吹在植物模型上,不能够简单地将力离散到每个节点上,需要根据Tet的位置来决定顶点力的大小,按照常识来看,迎着风的三角面肯定受力,背着风的三角面不受力。具体说来就是植物表面三角面的法向和风向的夹角决定了顶点受力的大小。

在计算风力的时候,需要计算风的方向向量和三角面法向的点乘,作为一个计算的系数。最终三角面上风的大小就是:

F = windStrength * sin(simulationTime) * sin(theta) * windDirection

分配到顶点上的力就是1/3 * F.当然,这也是近似计算,因为三角面的大小不同,实际中受力应该是不同的。

整个模拟的流程相关代码如下

double forceStrength = m_configs.value(QStringLiteral("strength")).toDouble();
auto directionList = m_configs.value(QStringLiteral("direction")).split(" ");
Vector3d windDirection(directionList[0].toDouble(), directionList[1].toDouble(), directionList[2].toDouble());
windDirection.Normalize();

//Calculate forces on every vertices
double sinTime = sin(6 * m_simuTime) + 1;
double sinTime2 = sin(2 * m_simuTime) + 1;
double sinTime3 = sin(m_simuTime) + 1;

m_integrator->ClearExternalForce();
for(int i = 0; i < surfaceNormal.size(); i++)
	{
		Vector3d tmpNormal(surfaceNormal[i].x(), surfaceNormal[i].y(), surfaceNormal[i].z());
		tmpNormal.Normalize();
		double dotResult = tmpNormal.Dot(windDirection);
		if(dotResult < 0)
		{
			//Add windforce in face to vertices
			Vector3d windDrag = dotResult * forceStrength * sinTime * windDirection;
			Vector3d windDrag2 = dotResult * forceStrength * sinTime2 * windDirection;
			Vector3d windDrag3 = dotResult * forceStrength * sinTime3 * windDirection;
			Vector3d averageForce = (windDrag + windDrag2 + windDrag3) * 0.33;
			externalForce[surfaceFace[i]] += averageForce;
			externalForce[surfaceFace[i-1]] += averageForce;
			externalForce[surfaceFace[i-2]] += averageForce;
		}
	}
m_integrator->AddExternalForce(externalForce);

m_integrator->BackwardEulerStep(m_timeStep);
m_flagDumpingImg = true;
m_tetMesh->GetVertices() = m_integrator->GetNodalPosition();
DumpNode(m_tetMesh->GetVertices(),frame_index++);

上面计算了三个sinTime,是为了增加风的随机性,让植物看上去更自然一些。

运行效果如下

参考

GPU-Generated Procedural Wind Animations for Trees - http://http.developer.nvidia.com/GPUGems3/gpugems3_ch06.html

Physically Based Real-Time Translucency for Leaves

植物风场运动模拟(Wind Animations for Trees)

时间: 2024-10-16 05:24:39

植物风场运动模拟(Wind Animations for Trees)的相关文章

C# 城市路网地图生成与运动模拟(一)-数据的获取

雪影工作室版权所有,转载请注明[http://blog.csdn.net/lina791211] 1.前言 这段时间一直在研究城市路网,某一天受不可告人的启发,决定把城市路网的地图做出来,然后模拟移动对象在路网上的运动,故本人开始了模拟地图生成的不归路. 任务要求: (1)通过一组城市路网街道的数据(图的格式存储,demo数据下面给),把城市路网数据转换成坐标数据(其实这一步,我拿到的数据已经转换完成了,也就是说我拿到了的是平面坐标数据,而不是球面经纬度数据): (2)根据平面坐标数据,使用Ja

运动-模拟返回顶部

第一步:获取底部的那个按钮对象,默认的情况下那个按钮对象是不可见的.可见的条件的是滚轮距离顶部有距离.var oBtn=document.getElementById('btn1'); 第二步:添加滚轮事件.(1). 获取滚轮距离顶部的距离.如果距离大于0,就将按钮对象可见.var scrollT=document.documentElement.scrollTop||document.body.scrollTop;if(scrollT >0){ oBtn.style.display='bloc

N体运动的程序模拟

这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引力下的运动模拟. 程序中使用了两个物理定律: (1)万有引力定律 这是牛顿发现的:任意两个质点有通过连心线方向上的力相互吸引.该引力的大小与它们的质量乘积成正比,与它们距离的平方成反比,与两物体的化学本质或物理状态以及中介物质无关. 以数学表示为: 其中: : 两个物体之间的引力 : 万有引力常数 : 物体1

编程模拟自然(七):力学矢量与牛顿定律

序 旧书有云:古者十日并出,草木焦槁,一曰后羿者射日,太阳里之九鸟皆死,救苍生于涂炭. 传闻后羿所用箭矢加持了力学模拟系统,可实现深空精确制导,才得以击落太阳. ... “星星挂在天边,就像梦想遥不可现...”元哼唧着. “猿叔你在哼什么曲子啊?” “...星星消失在天边,就像诺言来不及实现...”元对无名儿捂着双耳选择无视. “咳咳,我这是在朗诵诗人小刚的诗歌呢!” ... 第零章 “星星挂在天...你爸曾经射落过太阳?”元刚要继续深情朗诵,似乎想到了什么. “是的,听娘说爹地最厉害了.” “

精品软件4

QQ:365543212 ............................ DEM Solutions产品: EDEM v2.7 Win64 1CD EDEM v2.6 Win64 1CD(离散元专用分析软件) EDEM Dem-Solutions 2.6.0 RC1 for Linux64 1CD Metacomp Technologies产品: Metacomp CFD++ v14.1.1 Win64 1DVD Metacomp.CFD++.v11.1.Win32-ISO 1DVD(

多年收集的一些稀有软件2

QQ:365543212 Fuel Economy Calculator v1.1 B.001(汽车工程软件,用于预测车辆燃油消耗率,是目前此类软件中最为全面的,能接收从最新的发动机分析程序Engine Analyzer自动发送来的强大的游标和发动机规格) Psat v5.1 1CD ProScan.v5.1 1CD PowerFlow v3.3p3a for Linux 1CD(Exa公司的汽车外气流计算软件) Rotating Inertia Calculator v1.1 A.000(一款

arcengine 开发经典帖 【强烈推荐仔细研读】

转自原文 arcengine 开发经典帖 使用ArcGIS Engine 开发自定义GIS应用: 第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine的产品. 第二部分:ArcEngine9.2的新特性及变化.(续)--类对比及变化.(续)--(代码转换插件).(续)--ArcEngine新命令,工具.菜单和面板 第三部分:使用 ArcGIS Engine开发应用程序(自定义或嵌入) 第四部分:开发Engine 应用程序的基本原理.(续).(续)

IronCAD.Design.Collaboration.Suite.2016.v18.0

MISSLER.TOPSOLID.V7.10新一代CAD/CAM软件TopSolid 7是Missler Software开发的新一代CAD/CAM软件.新的软件基于下面的特点开发: 技术数据的管理与ERP系统关联 支持大型装配管理 界面友好,易学易用 TopSolid 7 通过简化设计和组织架构中的大型装配的修改,为CAD/CAM市场提供了革命性的创新.相比与传统得到CAD/CAM解决方案,用户使用TopSolid 7 能大约提高30%的效率. 优异的性能: TopSolid 7完全基于最新的

cocos2d-x 如何制作一个类马里奥的横版平台动作游戏 1 献给所有对动作游戏有爱的朋友

本文翻译自国外著名IOS源码教学商业网站raywenderlich 的IOS Game Start Kits三件套之一的Platformer Game/平台动作游戏的前奏曲,另一个是Beat'Em up Game/横版格斗游戏,作者是国外著名游戏开发专家Jake Gundersen,曾参与开发过SFC时代的洛克人X系列. 原文网址: http://www.raywenderlich.com/15230/how-to-make-a-platform-game-like-super-mario-br