使用正弦或余弦函数的 C/C++ 3D 烟花效果

2023-12-01

I am trying to implement fireworks effect in C. I have a cube with dimensions 10x10x10. A rocket starts from the ground, and when it reaches 8th floor it explodes. Here's the point I cannot do - the explosion. How can I implement this using sine or cosine function?enter image description here

a busy cat

所以在点(5,0,7) //(x,y,z)//火箭升空

for (j=0; j<9; j++) {
    setpoint(x, y, j);
    delay(100);
    clean();  //clears everything
}

爆炸的要点来了。如何实现这一目标?它也可以在随机位置闪闪发光。提前致谢。


呵呵,我确实找到了一些时间(在 1.5 Hod 中完成)并且愿意做这个有趣的事情:)

好的,首先在 LED_cube 类中进行一些更新以支持体素点输出并调暗其余部分与您的另一个问题中的球体相同......

//---------------------------------------------------------------------------
//--- LED cube class ver: 1.01 ----------------------------------------------
//---------------------------------------------------------------------------
#ifndef _LED_cube_h
#define _LED_cube_h
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
const int _LED_cube_size=32;
//---------------------------------------------------------------------------
class LED_cube
    {
public:
    int n,map[_LED_cube_size][_LED_cube_size][_LED_cube_size];

    LED_cube()              { n=_LED_cube_size; }
    LED_cube(LED_cube& a)   { *this=a; }
    ~LED_cube()             { }
    LED_cube* operator = (const LED_cube *a) { *this=*a; return this; }
    //LED_cube* operator = (const LED_cube &a) { /*...copy...*/ return this; }
    void cls(int col);                                  // clear cube with col 0x00BBGGRR
    void mul(int mul);                                  // mull all channels by mul and then shr by 8
    void point(int x,int y,int z,int col);              // draws voxel with col 0x00BBGGRR
    void sphere(int x0,int y0,int z0,int r,int col);    // draws sphere surface with col 0x00BBGGRR
    void glDraw();                                      // render cube by OpenGL as 1x1x1 cube at 0,0,0
    };
//---------------------------------------------------------------------------
void LED_cube::cls(int col)
    {
    int x,y,z;
    for (x=0;x<n;x++)
     for (y=0;y<n;y++)
      for (z=0;z<n;z++)
       map[x][y][z]=col;
    }
//---------------------------------------------------------------------------
void LED_cube::mul(int mul)
    {
    union { BYTE db[4]; int dd; } c;
    int x,y,z,i;
    for (x=0;x<n;x++)
     for (y=0;y<n;y++)
      for (z=0;z<n;z++)
        {
        c.dd=map[x][y][z];
        i=c.db[0]; i=(i*mul)>>8; c.db[0]=i;
        i=c.db[1]; i=(i*mul)>>8; c.db[1]=i;
        i=c.db[2]; i=(i*mul)>>8; c.db[2]=i;
        map[x][y][z]=c.dd;
        }
    }
//---------------------------------------------------------------------------
void LED_cube::point(int x,int y,int z,int col)
    {
    if ((x>=0)&&(x<n))
     if ((y>=0)&&(y<n))
      if ((z>=0)&&(z<n))
       map[x][y][z]=col;
    }
//---------------------------------------------------------------------------
void LED_cube::sphere(int x0,int y0,int z0,int r,int col)
    {
    int x,y,z,xa,ya,za,xb,yb,zb,xr,yr,zr,xx,yy,zz,rr=r*r;
    // bounding box
    xa=x0-r; if (xa<0) xa=0; xb=x0+r; if (xb>n) xb=n;
    ya=y0-r; if (ya<0) ya=0; yb=y0+r; if (yb>n) yb=n;
    za=z0-r; if (za<0) za=0; zb=z0+r; if (zb>n) zb=n;
    // project xy plane
    for (x=xa,xr=x-x0,xx=xr*xr;x<xb;x++,xr++,xx=xr*xr)
     for (y=ya,yr=y-y0,yy=yr*yr;y<yb;y++,yr++,yy=yr*yr)
        {
        zz=rr-xx-yy; if (zz<0) continue; zr=sqrt(zz);
        z=z0-zr; if ((z>0)&&(z<n)) map[x][y][z]=col;
        z=z0+zr; if ((z>0)&&(z<n)) map[x][y][z]=col;
        }
    // project xz plane
    for (x=xa,xr=x-x0,xx=xr*xr;x<xb;x++,xr++,xx=xr*xr)
     for (z=za,zr=z-z0,zz=zr*zr;z<zb;z++,zr++,zz=zr*zr)
        {
        yy=rr-xx-zz; if (yy<0) continue; yr=sqrt(yy);
        y=y0-yr; if ((y>0)&&(y<n)) map[x][y][z]=col;
        y=y0+yr; if ((y>0)&&(y<n)) map[x][y][z]=col;
        }
    // project yz plane
    for (y=ya,yr=y-y0,yy=yr*yr;y<yb;y++,yr++,yy=yr*yr)
     for (z=za,zr=z-z0,zz=zr*zr;z<zb;z++,zr++,zz=zr*zr)
        {
        xx=rr-zz-yy; if (xx<0) continue; xr=sqrt(xx);
        x=x0-xr; if ((x>0)&&(x<n)) map[x][y][z]=col;
        x=x0+xr; if ((x>0)&&(x<n)) map[x][y][z]=col;
        }
    }
//---------------------------------------------------------------------------
void LED_cube::glDraw()
    {
    #ifdef __gl_h_
    int x,y,z;
    float p[3],dp=1.0/float(n-1);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE,GL_ONE);

    glPointSize(2.0);

    glBegin(GL_POINTS);

    for (p[0]=-0.5,x=0;x<n;x++,p[0]+=dp)
     for (p[1]=-0.5,y=0;y<n;y++,p[1]+=dp)
      for (p[2]=-0.5,z=0;z<n;z++,p[2]+=dp)
        {
        glColor4ubv((BYTE*)(&map[x][y][z]));
        glVertex3fv(p);
        }
    glEnd();
    glDisable(GL_BLEND);
    glPointSize(1.0);
    #endif
    }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
//--------------------------------------------------------------------------
  • 重要的是:
  • void mul(int mul);- 用于调暗整个体素图
  • void point(int x,int y,int z,int col);- 用于设置单个体素的颜色

现在的颗粒

//---------------------------------------------------------------------------
class particle
    {
public:
    double  x, y, z;    // position
    double vx,vy,vz;    // velocity
    double ax,ay,az;    // acceleration driving force/m after update is reseted
    double i;           // intensity
    particle()
        {
         x=0.0;  y=0.0;  z=0.0;
        vx=0.0; vy=0.0; vz=0.0;
        ax=0.0; ay=0.0; az=0.0;
        i=0.0;
        };
    particle(particle& a){ *this=a; };
    ~particle(){};
    particle* operator = (const particle *a) { *this=*a; return this; };
//  particle* operator = (const particle &a) { ...copy... return this; };

    void update(double dt)
        {
        double c0,c;
        // gravity
        ay-=9.81;
        // friction in gass
        c=0.001;
        if (vx>0.0) c0=-c; else c0=+c; ax+=vx*vx*c0;
        if (vy>0.0) c0=-c; else c0=+c; ay+=vy*vy*c0;
        if (vz>0.0) c0=-c; else c0=+c; az+=vz*vz*c0;
        // friction in liquid
        c=0.0;
        ax-=vx*vx*vx*c;
        ay-=vy*vy*vy*c;
        az-=vz*vz*vz*c;
        // D'ALembert
        vx+=ax*dt;
        vy+=ay*dt;
        vz+=az*dt;
         x+=vx*dt;
         y+=vy*dt;
         z+=vz*dt;
        // reset acceleration
        ax=0.0; ay=0.0; az=0.0;
        }
    };
//---------------------------------------------------------------------------
List<particle> particles; // use any list/array you have at your disposal you need just function add and delete item
//---------------------------------------------------------------------------

这是绘制场景的方法:

cube.mul(200);          // dimm the voxel map insted of clearing it  (intensity*=200/256)
for (int i=0;i<particles.num;i++)
    {
    particle *p=&particles[i];
    int j=double(255.0*p->i);
    if (j<0) j=0;
    if (j>255) j=255;
    cube.point(p->x,p->y,p->z,0x00010101*j);
    }
cube.glDraw();

这是如何更新某些计时器中的模拟(双倍 dt=以秒为单位的计时器间隔!!!)

double i0=1.0; // intensity at shoot start
double i1=0.9*i0; // intensity after explosion
double v0=0.6*double(_LED_cube_size); // shoot start speed
double v1=0.5*v0,v1h=0.5*v1; // explosion speed
if (particles.num==0) // shoot new particle if none in list
    {
    particle p;
    p.x=_LED_cube_size>>1;
    p.y=0.0;
    p.z=_LED_cube_size>>1;
    p.vy=v0;
    p.i=i0;
    particles.add(p);
    }
for (int i=0;i<particles.num;i++) // update all particles in list
    {
    particle *p=&particles[i];
    p->update(dt);
    if (fabs(p->i-i0)<1e-6)     // intensity detect state before explosion
        {
        if (p->vy<=0.0)         // explode near/after peak reached
            {
            particle q;
            q.x=p->x;               // copy position
            q.y=p->y;
            q.z=p->z;
            q.i=i1;                 // new intensity
            particles.del(i);       // remove old particle
            i--;
            for (int j=0;j<50;j++)  // add new random particles
                {
                q.vx=v1*Random()-v1h;
                q.vy=v1*Random()-v1h;
                q.vz=v1*Random()-v1h;
                particles.add(q)-v1h;
                }
            continue;               // avoid usage of p pointer after delete
            }
        }
    else{                       // after explosion
        p->i*=0.95;             // dimm intensity
        }
    if ((p->y<0.0)||(p->i<0.01))// remove particles below the ground or too dimmed out
        {
        particles.del(i);
        i--;
        continue;               // avoid usage of p pointer after delete
        }
    }

这就是它的样子

particles

对不起,横幅,但我没有任何可靠的 gif 转换,并且该网站不接受 wmv ...您必须使用常量来匹配 LED 立方体大小常量上所需的输出:

  1. 整个立方体贴图调光率 (cube.mul(200)) 当前每帧 (200/256)
  2. 速度、强度v0,v1,i0,i1
  3. 目前爆炸后新粒子数量为 50
  4. 爆炸后粒子强度调暗率目前为0.95

[Notes]

List<>只是动态数组的模板可以使用以下任何内容std::或者自己的数组...

不要忘记设置dt更新之间经过的时间常数。希望我没有忘记复制一些东西。希望能帮助到你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用正弦或余弦函数的 C/C++ 3D 烟花效果 的相关文章

  • 为什么通过派生类对基类的引用与 :: - 运算符不明确?

    所以我想知道为什么以下钻石问题的代码片段无法编译 我知道这个问题通常是通过虚拟继承来解决的 我不是故意使用它的 该代码只是为了展示我的问题 即为什么编译器称此不明确 因此 我在 struct Base 中声明了两个成员变量 因为这两个子类
  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • MFC CList 支持复制分配吗?

    我在 MSVC 中查找了 CList 定义afxtempl h http www cppdoc com example mfc classdoc MFC AFXTEMPL H html并记录在MSDN http msdn microsoft
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • 在Python中读取字段中包含逗号的CSV文件

    我需要读取一个 CSV 文件 其中包含带有逗号的字段 因此我对包含逗号的字段进行了双引号 例如 1 text1 text2 text3 text4 a b c 但是当我尝试在 Python 中读取文件时 我得到用逗号分隔的字段 如下所示 r
  • Jssor Slider:响应式代码

    我正在使用 Jssor 滑块 http www jssor com demos slider cluster html 由于我的幻灯片很大 宽度约为 2000 像素 因此它们在较小的设备 甚至 iPad 上会显着缩放 我不介意在较小的设备上
  • 获取扩展文件属性

    我找到了这个帖子 这解释了如何获取 net 中的扩展文件属性 但它指向一篇已有 10 年历史的代码项目文章 该线程本身已有 5 年历史 现在是否有更好的方法来获取扩展文件属性 如标题 副标题 剧集名称等 我真正想做的是获取各个文件的扩展文件
  • Socket.IO 中的套接字参考

    我是 Nodejs 新手 正在尝试使用 socket io 我正在尝试将消息发送到特定的套接字 因此我想我将存储对套接字的引用 var controls var clients var control io of control on co
  • Twitter Typeahead.js Bloodhound 远程返回未定义

    远程版本 Twitter Typeahead js 无法正常工作 我的建议得到 未定义 任何帮助 将不胜感激 代码如下 JS var films new Bloodhound datumTokenizer Bloodhound tokeni
  • 使用 Apache Camel UnZippedMessageProcessor 解压缩文件

    尝试使用 Apache Camel 解压缩文件 我尝试了中给出的示例http camel apache org zip file dataformat html但我找不到解压消息处理器班级 这是代码 import java util Ite
  • 如何在 Sublime Text 中自定义文件类型与语法关联?

    我希望 Sublime 2 编辑器将 sbt 文件 以突出显示语法 视为 Scala 语言 与 scala 相同 但我找不到在哪里进行设置 你碰巧知道吗 在 Sublime Text 中 在 v2 x 和 v3 x 中均得到确认 有一个菜单
  • SSRS动态共享数据源

    我有一个 ASP Net 网站 它使用 Microsoft Report Viewer Control 显示各种 SSRS 报告 我需要能够在运行时指定数据源 似乎我应该能够在呈现报告时指定 共享 数据源的名称 但我确实找不到方法来做到这一
  • 从 PostgreSQL 中的时间戳中提取日期 (yyyy/mm/dd)

    我想从 PostgreSQL 中的时间戳中提取日期部分 我需要它是一个 postgresqlDATE类型 以便我可以将其插入到另一个需要的表中DATE value 例如 如果我有2011 05 26 09 00 00 我想2011 05 2
  • 带有令牌参数的 https URL:安全性如何?

    在我们的网站上 我们根据用户的私人信息 通过表格提供 向用户提供模拟 我们希望允许他们稍后返回模拟结果 但不强迫他们创建登录 密码帐户 我们考虑过向他们发送一封带有链接的电子邮件 他们可以从中获取结果 但是 自然地 我们必须保护这个 URL
  • 将 XML 文件读入 DataTable 的代码

    我编写了以下代码 用于读取给定的 xml 文件并将内容写入数据表 请不要建议使用 LinqToXml 因为该选项已被规则 因为这是一个遗留应用程序 create the DataTable that will hold the data D
  • 在 python for 循环中使用“or”来定义默认序列

    我在某处看到过 for 循环的用法 def func seq None for i in seq or 1 2 3 print i func 3 4 5 Will print 3 4 5 func Will print 1 2 3 似乎当使
  • 六位unicode转义值比较

    例如 我有一个六位数的 unicode 字符U 100000我想与另一个进行比较char在我的 C 代码中 我读到的MSDN 文档是这个字符不能用 a 来表示char 并且必须由string 字符文字中不允许使用 U 10000 到 U 1
  • 在 Python 中展平字典或列表的通用 JSON 列表

    我有一组任意 JSON 数据 已在 Python 中解析为字典列表和不同深度的列表 我需要能够将其 扁平化 为一个字典列表 下面的例子 源数据示例1 u industry u id u 112 u name u A u id u 132 u
  • 批处理 – 如何正确分配可能包含引号的任意百分比数字 (%1) 或百分比星号 (%*) 参数?

    在从事我的工作时previous问题 我遇到了我最初正在解决的类似问题 实际上 我花了这个月的时间尝试创建一个通用的 bat 帮助程序库 该库将尽可能最好地处理任何名称的拖放文件 我想对调用者透明地执行此操作 并向后兼容任何现有脚本 因此文
  • Chrome 中 上 之间的悬停状态丢失

    我试图通过当用户将鼠标悬停在行上时更改行的背景颜色来实现简单的表行悬停效果 这很简单 tr hover background red 但是我注意到 Chrome 中的一个错误 其中一行中的单元格之间有一个很小的空间 我丢失了 hover和
  • 从android中的edittext框获取XXX-XXX-XXXX格式的电话号码

    你好 我正在编写一个 android 其中用户在编辑文本框中输入电话号码 我希望数字采用 xxx xxx xxxx 的形式 这意味着在用户输入前 3 个字母和另一个 后 应自动出现 I used EditText anum EditText
  • Java:如何注册侦听 JFrame 运动的侦听器

    如何跟踪 JFrame 本身的移动 我想注册一个每次都会被回调的监听器JFrame getLocation 将返回一个新值 EDIT这是一个代码 显示接受的答案正在解决我的问题 import javax swing public class
  • 使用通配符 SSL 证书通过 HTTPS 进行 WCF

    我们是在线浏览器内管理工具的开发人员 我们的主要软件目前通过互联网托管并可供客户访问 每个客户都有自己的主要软件实例和子域 例如 customerA ourdomain com 定向到在虚拟服务器上运行的客户 A 的服务 customerB
  • 使用正弦或余弦函数的 C/C++ 3D 烟花效果

    I am trying to implement fireworks effect in C I have a cube with dimensions 10x10x10 A rocket starts from the ground an