Flash与3D编程探秘(六)- 全方位旋转摄像机

【flash】pv3d制作3d模型查看器 禁止转载 禁止转载 禁止转载 禁止转载 不知道为什么开发flash 的好像特别少,这里用到的是pv3d引擎 1.引擎的导入 首先要下载下来然后放到一个文件夹里。新建一个flash 至于为什么要插入这个地址我也很懵,不过如果把pv3d的文件夹用src文件夹包裹起来,然后写相对路径也是可以的。 把关联加进来之后就可以用pv3d 的数据 阅读详情

前面讨论过了如何横向旋转和移动摄像机,希望你已经完全理解,因为本文中的内容紧接着上一篇。回想一下,在前面制做的动画中,摄像机的旋转一直是围绕着y轴(竖直向上的轴)旋转,然而现实中我们可以上下旋转摄像机,甚至可以把摄像机倾斜一定角度,这就提醒了大家还需要更深入的研究旋转这个课题。下面几个动画演示了摄像机(简单的摄像机轮廓)3种旋转模式,从左到右分别是横向旋转,纵向旋转,倾斜。从3D空间角度来说,分别是沿y,x和z轴旋转。

 

      

横向和纵向旋转摄像机



倾斜摄像机


再介绍一些三角函数方程

事情变得复杂起来了!不过请你还是保持头脑清醒,这一篇文章你的任务就是学会纵向旋转和倾斜摄像机。你也许会想,我已经学会了横向旋转摄像机,算法中使用了一个panning的变量代表旋转角度,那么我再加两个变量,然后按顺序先沿x旋转,然后再沿y,最后z旋转不就好了。Well,这种想法很接近但却是错的(不要把3D数学想的那么简单)。来看一下下面的两个图,还是以3D空间在2D平面上的投影举例,把线段OB沿着z轴(也就是2D平面上 的原点)旋转大约78度,可以看到OB的长度就是我们的旋转半径。那么接下来,把OB沿y轴旋转,看一下图中的旋转半径是多少?不难看出,旋转半径明显的变小了。继续,如果你沿y旋转后,再打算沿x轴旋转,你还是会有同样“半径变化”的问题。

先沿z轴旋转再试图沿y旋转

 

在上面的例子中,如果想要保持旋转半径不变,那么一开始就不要有旋转角度。不过拿着摄像机左转右转,怎么可能保持角度不变!?因此你要在每一次摄像机旋转后,计算新的旋转半径。可是如果每一次都把旋转半径计算出来,那一定是很头疼!


于是人们聪明的想到了省力的方法。先来再看一下2D的三角函数(又是三角函数),根据旋转半径和旋转角度可以得到x和y:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> x  =  Math.cos(angle) * radius;
y 
=  Math.sin(angle) * radius;


需要注意一点,上面的方程式旋转点为原点,并且之前旋转角度为0。如果之前就有旋转角度a,再旋转b,那么方程式就成了:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> x  =  Math.cos(a + b) * radius;
y 
=  Math.sin(a + b) * radius;

看起来眼熟,但是不知道是什么了?别担心:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> cos(a + b)  =  cos(a) * cos(b)  -  sin(a) * sin(b);
sin(a
+ b)  =  sin(a) * cos(b)  +  sin(b) * cos(a);

把cos(a+b)和sin(a+b)带入上面的x和y求值方程我们就有:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> x  =  radius * cos(a) * cos(b)  -  radius * sin(a) * sin(b);
y 
=  radius * sin(a) * cos(b)  +  radius * sin(b) * cos(a);

化简一下得到:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> x  =  x_before * cos(b)  -  y_before * sin(b);
y 
=  x_before * sin(b)  +  y_before * cos(b);

这样,使用上面两个方程,不用担心你在其他平面(xz或者yz平面)的旋转角度,也不用每一次旋转后再去计算物体新的旋转半径了,只要关心旋转后的x和y,并且把它们作为下一次旋转的x_before和y_before,问题就解决了。下面我把相应的方程式写上:

围绕y轴旋转pan角度:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> x  =  Math.cos(pan) * x_before  -  Math.sin(pan) * z_before;
z 
=  Math.sin(pan) * x_before  +  Math.cos(pan) * z_before;

围绕x轴旋转pitch角度:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> y  =  Math.cos(pitch) * y_before  -  Math.sin(pitch) * z_before;
z 
=  Math.sin(pitch) * y_before  +  Math.cos(pitch) * z_before;

围绕z轴旋转tilt角度:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> x  =  Math.cos(tilt) * x_before  -  Math.sin(tilt) * y_before;
y 
=  Math.sin(tilt) * x_before  +  Math.cos(tilt) * y_before;


那么基本的知识已经说完了。总结一下,当你在使用这些方程式操作摄像机全方位旋转的时候,只要取得相应的变量,然后替换在方程里就可以了。是不是看起来有点难理解?不要担心,适应这些东西是需要花一点时间(特别是这些对你来说还是新课题的话),不过适应以后你应该就觉得很简单了。坦白的说,其实你并不需要知道到底这些是怎样得来的,你只要知道如何使用它们,得到想要得结果就可以了(当然完全理解会对你以后的学习有一些帮助)。这些方程你可以写成一个函数,然后命名它为“给我旋转”方程,当你需要摄像机旋转的时候,只要呼唤“给我旋转”就好了,至于“给我旋转”怎么做的工作,你就不需要担心了。

 

 

全方位旋转摄像机 

只说这些理论的东西,你肯定会觉得乏味,那么我举个例子来说明。下面这个程序演示了摄像机的全方位旋转,运行程序你会看到你置身在一个巨大的正方体中,这个正方体是由很多我们的朋友小P组成的,不过这回用不同颜色的小P来代表不同的边。使用WS键控制纵向旋转,AD键控制横向旋转,QE控制倾斜角度,鼠标点击屏幕禁止或者允许鼠标移动控制纵向和横向旋转。



全方位旋转摄像机,使用WS纵向旋转,AD横向旋转,QE倾斜角度,鼠标点击禁止或者允许鼠标控制


制作步骤:

1. 首先定义几个常量,MAX_OBJ是每条边上的物体数量,CUBE_WIDTH是正方体的边长。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> //  constants
var MAX_OBJ  = 6 ;
var PI 
=   3.1415926535897932384626433832795 ;
var CUBE_WIDTH 
=   300 ;

 

 

2. 下面还是设置原点,场景,焦距等。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> //  same as usual
var origin  =   new  Object();
origin.x 
=  stage.stageWidth / 2 ;
origin.y 
=  stage.stageHeight / 2 ;
origin.z 
=   0 ;

var scene 
=   new  Sprite();
scene.x 
=  origin.x;
scene.y 
=  origin.y;
this .addChild(scene);

var focal_length 
= 400 ;

 

 

3. 设置摄像机,这回的摄像机多了几个新的属性,pitching是纵向旋转角度,tilt是倾斜的角度。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> var camera  =   new  Object();
camera.x 
=   0 ;
camera.y 
=   0 ;
camera.z 
=   0 ;
camera.panning 
=   - PI / 8 ;                 //  init pan angle of our camera, pan left
camera.pitching  =   - PI / 8 ;               //  pitch up
camera.tilt  =   0 ;                           //  and no tilt

 

 

4. 设置一些全局变量,在处理键盘和鼠标事件时会用到。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> //  global booleans for our keyboard control
var pan_left;
var pan_right;
var pitch_up;
var pitch_down;
var mouse_ctl 
=   true ;

 

 

5. 下面布置一个正方体,你完全不必要明白我是怎么布置场景的,因为布置场景的方式并不唯一,所以如果你愿意的话,你可以自己动手布置3D场景,当然我也不介意直接拷贝我的设置场景的代码去用。总之,这些代码就是初始化一些小P,然后把它们摆放在合适位置(围绕着摄像机)。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> //  ok, here you don't have to know how i acutally setup the cube
//  cause every body has a different way of doing that, if you really
//  interested in how i did it, then you may have a look
//  you can just copy my code and it will set it up for you
var len  =  CUBE_WIDTH / 2 ;
for  (var seg  =   0 ; seg  <   3 ; seg ++ )
{
    var line_h;
    var line_v;    
    var line_z;
    
    
switch  (seg)
    {
        
case   0 :
            line_h 
=   true ;
            line_v 
=   false ;
            line_z 
=   false ;
            
break ;
        
case   1 :
            line_h 
=   false ;
            line_v 
=   true ;
            line_z 
=   false ;
            
break ;
        
case   2 :
            line_h 
=   false ;
            line_v 
=   false ;
            line_z 
=   true ;
            
break ;
    }
    
    
for  (var i  =   0 ; i  <  MAX_OBJ; i ++ )
    {
        
if  (line_h  ||  (i  ==   0   ||  i  ==  MAX_OBJ - 1 ))
        {
            
for  (var j  =   0 ; j  <  MAX_OBJ; j ++ )
            {
                
if  (line_v  ||  (j  ==   0   ||  j  ==  MAX_OBJ - 1 ))
                {
                    
for  (var k  =   0 ; k  <  MAX_OBJ; k ++ )
                    {
                        
if  (line_z  ||  (k  ==   0   ||  k  ==  MAX_OBJ - 1 ))
                        {
                            var ball;
                            
if  (line_h)
                            {
                                ball 
=   new  SphereHorizontal();
                                
if  ((i  ==   0   ||  i  ==  MAX_OBJ - 1 ))
                                {
                                    ball 
=   new  SphereVertex();
                                }
                                
else
                                {
                                    ball 
=   new  SphereHorizontal();
                                }
                            }
                            
if  (line_v)
                            {
                                ball 
=   new  SphereVertical();
                                
if  ((j  ==   0   ||  j  ==  MAX_OBJ - 1 ))
                                {
                                    
continue ;
                                }
                            }
                            
if  (line_z)
                            {
                                ball 
=   new  SphereStraight();
                                
if  ((k  ==   0   ||  k  ==  MAX_OBJ - 1 ))
                                {
                                    
continue ;
                                }
                            }
                            ball.x_3d 
=   - len  +  (i) * (CUBE_WIDTH / MAX_OBJ);
                            ball.y_3d 
=   - len  +  (j) * (CUBE_WIDTH / MAX_OBJ);
                            ball.z_3d 
=   - len  +  (k) * (CUBE_WIDTH / MAX_OBJ);
                            scene.addChild(ball);
                        }
                    }
                }
            }
        }
    }
}

 

 

6. 下面的函数就是刷新小P位置和大小的函数,这也是这篇文章主要讲述的内容,所以,请集中。OK,首先要得出小P(其中一个小P)到摄像机的x,y和z 距离。对于横向旋转角度panning,使用本文前面讲述的方程,把相应的x距离和z距离带入,然后得出新的x距离和z距离。使用相同的方法得出 纵向旋转角度pitching后的y和z距离,对摄像机倾斜角度tilt再次使用上述方程。这样就得到围绕三个轴旋转后新的x,y和z距离,继而便可以使用老办法算出物体的缩放和移动。最后别忘记加一个z_near变量,存储小P到摄像机的距离,以便于对所有小P进行z排序。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> //  update ball size and position
//  here is what we really care about, so concentrate
function display(obj)
{    
    var x_distance 
=  obj.x_3d  -  camera.x;         //  first we determine x distance ball to camera
    var y_distance  =  obj.y_3d  -  camera.y;         //  y
    var z_distance  =  obj.z_3d  -  camera.z;         //  z distance
    
    var tempx, tempy, tempz;                       
//  some temporary variables
    
    
//  two more trig you need to know about, suppose a is the previous angle
    
//  cos(a+b) = cos(a)*cos(b) - sin(a)*sin(b)
    
//  sin(a+b) = sin(a)*cos(b) + cos(a)*sin(b)
    
//  thus we have the following
    var angle  =  camera.panning;
    tempx 
=  Math.cos(angle) * x_distance  -  Math.sin(angle) * z_distance;
    tempz 
=  Math.sin(angle) * x_distance  +  Math.cos(angle) * z_distance;
    x_distance 
=  tempx;
    z_distance 
=  tempz;
    
    angle 
=  camera.pitching;                     //  the same thing we have for pitch angle
    tempy  =  Math.cos(angle) * y_distance  -  Math.sin(angle) * z_distance;
    tempz 
=  Math.sin(angle) * y_distance  +  Math.cos(angle) * z_distance;
    y_distance 
=  tempy;
    z_distance 
=  tempz;
    
    angle 
=  camera.tilt;                          //  and tilt angle
    tempx  =  Math.cos(angle) * x_distance  -  Math.sin(angle) * y_distance;
    tempy 
=  Math.sin(angle) * x_distance  +  Math.cos(angle) * y_distance;
    x_distance 
=  tempx;
    y_distance 
=  tempy;
    
    
if  (z_distance  >   0 )                                           //  if the ball isin front of the camera
    {
        
if  ( ! obj.visible)                                
            obj.visible 
=   true ;                                     //  make the ball visible anyway
            
        var scale 
=  focal_length / (focal_length + z_distance);   //  cal the scale of the ball
        obj.x  =  x_distance * scale;                             //  calcualte the x position in a camera view 
        obj.y  =  y_distance * scale;                            //  and y position
        obj.scaleX  =  obj.scaleY  =  scale;                    //  scale the ball to a proper state
    }
    
else
    {
        obj.visible 
=   false ;
    }
    
    obj.z_near 
=  z_distance;             //  keep track of z distance to our camera
}

 

 

7. 写一个循环函数,不停的调用第6步的函数刷新所有的小P。如果你一直有看文章的话那么这些对你来说应该不难。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> //  loop to update the screen
function run(e:Event)
{
    
for  (var i  =   0 ; i  <  scene.numChildren; i ++ )                  //  update all the balls on the screen
    {
        display(scene.getChildAt(i));
    }
    
    swap_depth(scene);
}

//  bubble sort algo
function swap_depth(container:Sprite)
{
    
for  (var i  =   0 ; i  <  container.numChildren  -   1 ; i ++ )
    {
        
for  (var j  =  container.numChildren  -   1 ; j  >   0 ; j -- )
        {
            
if  (Object(container.getChildAt(j - 1 )).z_near  <  Object(container.getChildAt(j)).z_near)
            {
                container.swapChildren(container.getChildAt(j
- 1 ), container.getChildAt(j));
            }
        }
    }
}

 

8. 最后是设置一些键盘和鼠标事件响应函数,完成我们的程序。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> function key_down(e:KeyboardEvent): void
{
    
if  (e.keyCode  ==   65 )             //  a
        pan_left  =   true ;
    
if  (e.keyCode  ==   68 )             //  d
        pan_right  =   true ;
    
if  (e.keyCode  ==   87 )             //  w
        pitch_up  =   true ;
    
if  (e.keyCode  ==   83 )             //  s
        pitch_down  =   true ;
}
function key_up(e:KeyboardEvent):
void
{
    
    
if  (e.keyCode  ==   65 )
        pan_left 
=   false ;
    
if  (e.keyCode  ==   68 )
        pan_right 
=   false ;
    
if  (e.keyCode  ==   87 )
        pitch_up 
=   false ;
    
if  (e.keyCode  ==   83 )
        pitch_down 
=   false ;
}
function key_response(e:Event):
void
{
    
if  (pan_left)
        camera.panning 
-=   0.01 ;
    
if  (pan_right)
        camera.panning 
+=   0.01 ;
    
if  (pitch_up)
        camera.pitching 
-=   0.01 ;
    
if  (pitch_down)
        camera.pitching 
+=   0.01 ;
        
    
if  (mouse_ctl)                                 //  if allow mouse control pan and pitch
    {
        camera.panning 
+=  scene.mouseX / 22000 ;
        camera.pitching 
+=  scene.mouseY / 22000 ;
    }
    
    
//  limit the pitch and tilt
     if  (camera.pitching  <   - 1 * PI / 3 )
        camera.pitching 
=   - 1 * PI / 3 ;
    
if  (camera.pitching  >  PI / 3 )
        camera.pitching 
=  PI / 3 ;
}
function clicked(e:Event)                        
//  toggle mouse control
{
    mouse_ctl 
=   ! mouse_ctl;
}

//  setup event listeners
this .addEventListener(Event.ENTER_FRAME, run);
this .addEventListener(Event.ENTER_FRAME, key_response);
stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
stage.addEventListener(MouseEvent.CLICK, clicked);

 

 

总结一下,这篇文章中的三角函数部分可能有些抽象,因为是在3D空间中完成的,如果你把所有的例子首先映射到2D平面上会想对好理解一些。不过还是那句话,不要担心,你只要知道如何使用这些方程就可以了。

 

注意:物体自身围绕中心的3D旋转

有一点不知道你有没有注意,那就是在本文的开头,我做了几个摄像机的旋转演示。在演示里,摄像机(物体)都是本身在旋转,而并不是我们的眼睛(摄像机)在旋转。虽然到目前为止的文章里,还没有讨论到如何让物体自身旋转,不过很快就会看到一些例子。注:我做这些演示唯一想说明的就是三种旋转的机制,所以请不要着急那些演示是怎么做出来的。

 

其实,关于Flash和3D空间的基本知识的介绍到这里我想应该结束了,从下篇文章开始就要关注3D物体,因此,如果对前面文章中的基础知识还是模模糊糊的话,完全可以不必担心。不过我还是建议你自己多实验一些小例子,增加自己的空间感。相信你在不久的将来就可以开发自己的3D Engine了,加油,ALL THINGS ARE POSSIBLE!


上一篇          目录          下一篇

非常抱歉,文中暂时不提供源文件下载,如果你需要源文件,请来信或者留言给我。笔者利用工作之余写这些文章,付出了很多汗水,希望读者和转载者能够尊重作者的劳动。

作者:Yang Zhou
出处:http://yangzhou1030.cnblogs.com
本文版权归作者和博客园共有,转载未经作者同意必须保留此段声明。请在文章页面明显位置给出原文连接,作者保留追究法律责任的权利。
Papervision3D:使用Flash创建交互式3D图形 本文还有配套的精品资源,点击获取 简介:Papervision3D是一个基于Flash的开源3D引擎,利用ActionScript 3.0和Adobe Flash Player编程接口实现高性能3D渲染。本文深入探讨了Papervision3D的核心概念、主要功能,以及如何利用它进行3D游戏开发。通过学习其场景管理、摄像机、对象、光源和材质等概念,开发者能够构建模块化的3D... 阅读详情

相关推荐

FLARE3D安装包详细指南:提升你的3D Flash体验

在计算机图形学领域,FLARE3D 是一颗冉冉升起的新星,它以其创新的技术和流畅的用户体验,迅速占据了3D应用市场的有利地位。FLARE3D 的起源可以追溯到2009年,当一群富有激情的开发者决心创造一个既快速又高效的3D内容创作工具。凭借对3D渲染技术的深入理解,他们打造了FLARE3D,旨在提供给设计师和开发者一个强大的平台,用以构建交互式3D内容。

weixin_42298254的博客 1245

as3摄像机旋转和移动

上一篇讨论了关于旋转摄像机的一些基础知识,在这篇文章中我将介绍如何在程序中使用这些知识定点旋转摄像机,以及把移动和旋转摄像机结合在一起。当 只运用旋转摄像机时,在屏幕上看到物体围绕着摄像机旋转,动画并不是那么的”3D”,不过这个是必经之路,等你完全的明白了旋转这个概念后,再添加上摄像 机在3D空间移动,那样你就不会觉得乏味了。首先来看一个定点旋转摄像机的例子当作热身。这个例子,还是使用我们的小P,...

weixin_34186931的博客 189

flash as3 多点触控-缩放-旋转-滑动.zip

flash as3 多点触控-缩放-旋转-滑动,多点触控常用功能,可以用作触摸屏,直接复制用。

Camera Tuning职业介绍

前言 前面本人对Camera Tuning这个岗位进行了简单的描述,今天这篇博客我将继续对Camera Tuning工程师进行多个角度的介绍,以下内容皆为个人观点,如果有错误之处还望大家多多指正。 Camera Tuning是一个需要具备相关基础硬件知识储备以及牢固的光学知识支撑的软件研发岗位。一个Camera Tuning工程师同时也需要保持对色彩、清晰度等影响图像质量标准的变化的敏...

Liu小瓜的博客 1万+

Flash实现图片旋转交替展示的特效代码.rar

Flash图片旋转交替展示的特效代码,推荐用于电子商务网站相关的产品展示使用,通俗说就是图片切换特效,只是形式不太一样,而且适用的场合也不同,本效果做的相当动感漂亮,不过实用性觉得不大。来自:时尚起义   截图演示:

五、e2studio VS STM32CubeIDE之汉化

介绍stm32cubeide汉化方案和汉化包e2studio自带汉化包,在安装过程中可选择安装e2studio STM32CubeIDE切换中英文。

cl234583745的博客 1770

单目标定(相机棋盘法标定)

How to Calibrate a Monocular Camera http://www.vision.caltech.edu/bouguetj/calib_doc/ Description: This tutorial cover using thecamera_calibration'scameracalibrator.py node to calibrate a m

格物致知 1919

EtherCAT-7 从站代码移植-SPI

STM32F103 + AX58100,从站代码移植。

tianya_xuan的博客 3571

Flash3D编程探秘- Flash与3D空间

Flash 和 3D空间第一件事情我想你知道的是,在Flash里,并不存在真正的3D,或者我应该说,Flash CS3并不支持3D绘制。我们所做的是运用Flash里的2D绘制方法去模拟3D绘制,Flash并不知道3D是什么也不知道如何去处理3D对象。但是好消息是所有的3D处理和3D计算都是建立在数学计算的基础上的,加上Flash知道如何的处理数学计算。太好了,这些工具足以使我们创造出自己的动画了。这并不是说Flash里的3D编程要简单,与其相反,如果你打算深入去探索的话你会发现你会进行很大一部分的Low l

august5291的博客 540

手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

数字IC后端设计培训教程之手把手教你分析解决Innovus DRC Violation 和Antenna Effect Violation

weixin_37584728的博客 2942

FPGA/IC秋招经典100题(含详解)

FPGA/IC秋招笔试面试经典100题(含答案及详解),持续更新。。。

Crazzy_M的博客 1万+

Flash与3D编程探秘(五)- 摄像机旋转和移动

上一篇讨论了关于旋转摄像机的一些基础知识,在这篇文章中我将介绍如何在程序中使用这些知识定点旋转摄像机,以及把移动和旋转摄像机结合在一起。当只运用旋转摄像机时,在屏幕上看到物体围绕着摄像机旋转,动画并不是那么的"3D",不过这个是必经之路,等你完全的明白了旋转这个概念后,再添加上摄

roadProgram的专栏 1033

【教程4>第3章>第1节】通信系统高阶调制解调概述

高阶调制(High Order Modulation)是一种先进的数字调制技术,旨在通过增加每个符号携带的信息比特数来提高无线通信系统的数据传输速率和频谱效率。这种技术特别适用于具有较高信噪比(Signal-to-Noise Ratio, SNR)的通信环境,例如卫星通信、光纤通信以及一些高质量的无线通信链路。在数字通信中,调制是将数字信号(比特流)转换为适合在物理信道上传输的模拟信号的过程。高阶调制通过使用更多的信号状态或星座点来表示不同的比特组合,从而在一个符号周期内传输更多的信息。

FPGA/MATLAB学习教程/源码/项目合作开发 1704

Flash与3D编程探秘 - 文章目录

日期:2008年10月 介绍 对学习Flash CS3和Actionscript 3.0中的3D编程感兴趣?You come to the right place!在文章中,我将陆续的介绍在Flash中使用Actionsript进行3D编程一些理论和实例。这是一篇初级到中级难度的学习资料,如果你具有一些基本的数学和几何知识,那对你来说不会太难。请注意:这并不是针对Flash C...

weixin_30838921的博客 130

Plant Simulation 快速建模与布局(3)——自动生成的对象 代码“安全”删除管理

《PlantSimulation快速布局建模课程》教授利用SimTalk语言实现高效建模的技术要点,包括批量对象创建、阵列布局、属性管理及自动连接功能。重点讲解对象安全删除机制,通过existsObject检查对象存在性后使用deleteObject方法删除,避免程序报错。课程提供完整代码示例,展示如何通过循环结构实现矩阵布局对象的创建与安全删除,确保代码健壮性,显著提升建模效率。

qq_31964455的博客 119

深入剖析 YOLOv11 中的 C2PSA 注意力机制

YOLOv11中的C2PSA注意力机制在目标检测领域取得突破性进展。该机制通过跨通道分组交互和轻量级位置编码,在仅增加0.6%计算量的情况下提升mAP 1.5-2.3个百分点。C2PSA创新性地结合局部跨通道交互、位置编码和双分支并行调制,采用纯卷积实现自注意力,避免传统注意力机制的高计算复杂度。实验表明,C2PSA在COCO数据集上以微小计算代价显著提升检测性能,特别是对小目标和遮挡目标效果突出。该模块可直接嵌入YOLO架构,为轻量级目标检测提供新的优化方向。

shrgegrb的博客 3401

Flash与3D编程探秘(四)- 摄像机旋转基础知识

关于三角函数 现在已经把最基本的移动摄像机技巧介绍完了,并且我相信上篇的几个例子也应该让读者加深了印象。可是你会发现前面我们只是把摄像机沿着x轴,y轴或者z轴移动摄像机,可是实际中可以把摄像机向左,向右,向上或者向下旋转一定的角度,这样在观看空间时就有更大的自由度。 不过

roadProgram的专栏 907

高通Camx功能feature分析之八:高通NCS服务之架构和初始化

本文介绍了高通NCS(NONCameraSensor)服务的架构与初始化流程。NCS服务通过QMI接口访问非相机传感器,为CameraEIS、AEC等算法节点提供陀螺仪、加速度计等传感器数据支持。文章详细解析了NCS服务的分层架构,包括客户端、服务端、QSEE接口实现等组件,并重点分析了初始化过程中获取传感器列表、查询能力等关键步骤。通过camxsetting.xml中的enableNCSService开关控制服务启动,初始化过程涉及QSEE单例创建、传感器能力查询等核心操作。后续文章将继续深入讲解相关技术

931

Flash 3D引擎(Sandy3D)应用指南 3——使用摄像机。

原文地址:http://www.flashsandy.org/tutorials/3.0/sandy_cs3_tut03 这个指南的目标在这个指南中,我们将学习Camera3D对象的使用,在之前的指南里,我们只是使用摄像机作为整个场景的观察点,但从来没有真正使用过它,就连访问它的属性和方法都没有。 Camera3D 就像是一个静态对象——我们可以对它进行移动、旋转、滚动、倾斜。

民工 1750

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Flash与3D编程探秘(七)- 3D物体框架

从这篇文章开始,我将开始介绍3D物体及其在空间中运动和交互。这里提到的物体是指单个的实体,比如银河系中的一颗恒星,那么空间就是银河系了。不过,所有的一切都是相对的,当一个分子作为例子中的实体的时候,那么一个细胞也可以作为3D的空间来看待(一个细胞是由很多的分子组成),同理你可以知

roadProgram的专栏 703

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

用ActionScript在Flash中实现3D视角的控制

本文来自:9RIAFlash CS4专业版的3D能力允许我们进行变焦和透视角度的改变,而且他的强大3D处理数学函数让它在3D场景的内外导航起来更加简单。现在游戏开发者和动画家们能够轻而易举的导入三维视图和运动效果了。这个教程探讨的两种改变舞台显示效果的方法通过移动和变焦改变观察点在三维空间里移动对象本身移动观测角度是非常简单的,用起来就好像是

lihe111的专栏 2266

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

快速创建精彩的Flash游戏 (二) Flash3D游戏引擎简介

<br />从Flash Player 5开始,3D开发者就尝试做一些伪3D的演示;Flash Player 6时代,引入了Drawing API,大大方便了开发者进行图形绘制;2006年引入AS3,开始改变很多Web游戏的规模;Flash Player 10;2008年10月引入内置2.5D绘图支持,同时加入内置3D属性,比如旋转和变形,内置API控制空间三角形,并且允许处理透视;今年3月,Adobe在实验室推出了支持GPU加速的真正3D API - Molehill,将把互联网带入全新的三维时代。<br

wkyb608的专栏 2171
上一篇: Flash与3D编程探秘(五)- 摄像机旋转和移动
下一篇: Flash与3D编程探秘(七)- 3D物体框架
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值