什么是魔比斯环电影

class&Class1
&&&&public&virtual&void&Method1()&{}
&&&&public&virtual&String&Method2()&{&return&s;}
&&&&public&Class1(String&s){}&&&&
上面的Class1有一系列的virtual方法,并且有一个构造方法。下面让我们来编写一个代理Class1的代理类ProxyClass:
class&ProxyClass&:&Class1
&&&&public&override&void&Method1(){&base.Method1();&&}
&&&&public&override&String&Method2(){&String&s&=&base.Method2();&&return&s}
&&&&public&Class2(String&s)&:&base(s)&{}
从ProxyClass类可以看出,在使用下面代码创建Class1对象后,仍然会得到Class1类中相应方法执行后的结果:
Class1 class1 = new
ProxyClass(“hello world”);
虽然上面的代码可能大多数程序员都能理解(就是多态调用),但实际上这种代码对基于动态代理技术的AOP框架是毫无用处的。之所以叫动态代理,就是在程序执行时自动生成代理类。而上面的代码是静态地写到程序中的,在编译后无法更改。也许有人会说,根据Class1可以自动生成ProxyClass类的源码,然后在内存或硬盘上编译再调用不就可以了!这种做法可以是可以,但效率却非常的低。大家可以想象,如果每执行一个方法,就生成一堆C#源代码,再编译,恐怕C#就比脚本语言还慢了。
看到这些,也许那些C#或.net高手会说,直接生成MSIL不就行了。但你要知道,虽然MSIL没有汇编复杂,可对于大多数程序员来说,是可望而不可及的。因此,这个技术问题就成为实现AOP框架的第一个大障碍。
2. 如何拦截构造方法
AOP最重要的特性就是对方法的拦截,这其中也包括构造方法。所谓拦截,就是在执行原方法时,要在两个位置来执行我们织入的代码,如日志代码。这两个位置是before(在原代码执行之前)和after(在原代码执行之后)。当然,还可以对源代码进行around(完全取代原来的代码)。这对于普通的方法来说并不算什么,如上面的Method1方法。要想在ProxyClass类中的Method1方法拦截Class1类中的方法,before、after和around的实现分别如下:
public&override&void&Method1()&{&base.Method1();&&}
public&override&void&Method1()&{&&base.Method1();&}
public&override&void&Method1()&{&&&}
但这对于构造方法来说却无法实现。因此,在子类中调用父类中的构造方法只能在方法后面调用,如下面代码所示:
public Class2(String
s) : base(s) {...}
&& 从上面的代码可以看出,构造方法只能实现before,而不能实现after和around。也就是在子类中无论写不写base关键字,必须调用父类中的构造方法(如果不写,调用父类中无参数的默认构造方法)。更不会有下面的代码形式:
public Class2(String
s) {... base(s);}
因此,如何使构造方法也拥有after和around特性,就成为实现AOP构架的第二个拦路虎。
三、偶遇通往MSIL世界的“魔比斯环”,C#王权土崩瓦解
可能每个人都向往着穿越时空。然而有一群幸运的科学家却做到了。这些科学家在一个深谷中偶然发现了一个可以通往另一个世界的大门,这就是“魔比斯环”。通过“魔比斯环”,不仅能穿越时空,同时也将拥有无穷无尽的力量,尽管这么做会有带来一定的危险。
上面所描述的只是科幻电影中的场景。然而在现实世界也确实存在着很多的“魔比斯环”。如我们使用的C#就是这样。虽然C#是强大的,但我们必须受到C#语法和约定的限制。如一个重要限制是任何子类在创建其对象实例时,在子类的构造方法中必须调用父类的一个构造方法,如果不调用,C#编译器会自动在子类的构造方法加入调用父类构造方法的语句(无参数的默认构造方法)。我们可以先看看下面两个类:
&&&&class&ParentClass
&&&&&&&&public&ParentClass()
&&&&&&&&&&&&System.Console.WriteLine("ParentClass");
&&&&class&ChildClass&:&ParentClass
&&&&&&&&public&ChildClass()
&&&&&&&&&&&&System.Console.WriteLine("ChildClass");
如果在控制台程序中创建ChildClass对象,将输出如下的结果:
ParentClass
ChildClass
让我们用微软提供的反编译工具ildasm.exe(位置:C:"Program Files"Microsoft Visual Studio 8"SDK"v2.0"Bin"ildasm.exe)来反编译exe,看看为什么会这样。用ildasm.exe打开exe后的界面如图1所示:
&&&&&&&&&&&&&&&&&&&& 图1
双击图1所选中的部分,将会显示如下的中间语言代码:
.method&public&hidebysig&specialname&rtspecialname&
&&&&&&&&instance&void&&.ctor()&cil&managed
&&.maxstack&&8
&&IL_0000:&&ldarg.0
&&IL_0001:&&call&&&&&&&instance&void&ConsoleApplication1.ParentClass::.ctor()
&&IL_0006:&&nop
&&IL_0007:&&nop
&&IL_0008:&&ldstr&&&&&&"ChildClass"
&&IL_000d:&&call&&&&&&&void&[mscorlib]System.Console::WriteLine(string)
&&IL_0012:&&nop
&&IL_0013:&&nop
&&IL_0014:&&ret
读者可以不必管这些代码是什么意思,只要注意上面黑体字部分。C#编译器已经自动加入了调用ParentClass的构造方法的代码(.ctor()表示构造方法),这一行是去不掉的。找到问题所在,就意味着离成功又近了一步。从中间代码可以看出,如果不让C#编译器加上这行不就行了吗?但我又不能再设计一个C#编译器,因此,只能利用C#原来的编译器。
根据上面所述,现在我只要解决一个问题即可,就是要利用C#编译器来改变C#的规则。这就要求不能使用C#的代码,而构造方法的代码必须直接使用中间语言来完成(并不是象编译器一样直接生成dll或exe)。
这可真给我出了个难题。不过C#和.net framework的强大使用坚信一定有方法解决,只是我暂时没找到而已。
由于大多数使用虚拟机的语言都支持反射功能,因此,我决定碰碰运气,看看是否能通过反射解决这个问题。在.net中有一个命名空间System.Reflection。看了一下其中的类,基本都是用来得到信息的(方法、属性、Assembly的信息),并没有写入信息的(就是写入IL)。当我快要绝望的时候,终于眼前一亮。在System.Reflection中又发现了一个Emit命名空间。Emit的中文含义是“发出”的意思,想到此,我的希望又重新燃起。于是上MSDN查了关于Emit的资料。MSDN上说Emit的主要功能就是通过C#语言绕过C#编译器直接向内存中写入IL,相当于从硬盘上读取IL一样。yeah,这正是我需要的。有了这个,就可以动态生成代理类了。而且速度和静态类是一样的。
在Emit中提高了IL指令的全部映射。如下面的代码将直接用IL生成一个方法及其实现:
public&delegate&String&MyMethod(String&str);
&&&&&&&private&void&GenerateMethod()
&&&&&&&&&&&&Type[]&argsType&=&{&typeof(String)&};&&&&&&&&&&&&
&&&&&&&&&&&&DynamicMethod&dm&=&new&DynamicMethod("MyMethod1",
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&typeof(String),
&&&&&&&&&&&&argsType,
&&&&&&&&&&&&typeof(Form1).Module);
&&&&&&&&&&&&&&
&&&&&&&&&&&&ILGenerator&il&=&dm.GetILGenerator();
&&&&&&&&&&&&il.Emit(OpCodes.Ldstr,&"hello:");
&&&&&&&&&&&&il.Emit(OpCodes.Ldarg_0);
&&&&&&&&&&&&il.Emit(OpCodes.Call,&typeof(String).GetMethod("Concat",&new&Type[]{typeof(String),&typeof(String)}));
&&&&&&&&&&&&il.Emit(OpCodes.Ret);
&&&&&&&&&&&&MyMethod&myMethod&=&(MyMethod)dm.CreateDelegate(typeof(MyMethod));
&&&&&&&&&&&&MessageBox.Show(myMethod("my&friends"));&&&&&&&&&&&&
上面的GenerateMethod方法动态地生成了一个MyMethod1方法,并显示如图2的对话框:
在上面代码中主要有三个地方需要提一下:
1. OpCodes包含了IL的所有的指令。如OpCodes.Ldstr表示将一个字符串压栈(每个方法都有一个操作栈),OpCodes.Call表示调用C#中的其他方法。
2. DynamicMethod类可以建立动态的普通方法。如果想建立构造方法,可以使用ConstructorInfo。
3. 所有的IL代码都是通过ILGenerator的Emit方法写入内存的。
Emit就象电影中的“魔比斯环”一样,可以很容易地突破C#的限制,从而穿越了C#世界,到达了另外一个MSIL世界。这将为我们实现另人振奋的功能提供了可能性。
四、在MSIL世界建立起强大的AOP帝国
既然能用C#直接写MSIL,那么就可容易编写AOP框架了。虽然这是用C#代码写MSIL,但也要对MSIL有一定的了解,感兴趣的读者可以到微软网站去下载IL
Specification。
由于这个AOP框架的代码十分庞大,在这里只给出了一些代码片段。实现AOP框架的核心就是生成动态代理类。因此,使用IL生成代理类的框架是第一步。下面是生成代理类框架的核心代码:
&&&&public&TypeBuilder&GenerateType()&&//&返回动态代理类的Type
&&&&&&&&string&className&=&GetNewClassName();
&&&&&&&&TypeAttributes&typeAttributes&=&TypeAttributes.Class&|&TypeAttributes.Public&|&TypeAttributes.S
&&&&&&&&TypeBuilder&typeBuilder&=&&m_EmitClassInfo.Module.DefineType(className,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&typeAttributes,&m_EmitClassInfo.BaseType);
&&&&&&&&return&typeB
从上面的代码很容易猜到我要生成一个public的sealed类(不可继承)。接下来就是根据父类生成相应的方法(包括普通方法和构造方法),下面是一些代码片段:
&&&&private&void&GenerateMethod()&&//&生成普通的方法
&&&&&&&&MethodAttributes&methodAttributes&=&MethodAttributes.P
&&&&&&&&MethodBuilder&methodBuilder&=&
m_TypeBuilder.DefineMethod("__GetMethodInvocation",&methodAttributes,&typeof(IMethodInvocation),&new&Type[]&{&typeof(ICallable),&typeof(MethodInfo)&});
&&&&&&&&&&&&m_EmitClassInfo.__GetMethodInvocation&=&methodB
&&&&&&&ILGenerator&ilGenerator&=&methodBuilder.GetILGenerator();&&&&&
&&&&&&&Label&execIfLabel&=&ilGenerator.DefineLabel();
&&&&&&&Label&endIfLabel&=&ilGenerator.DefineLabel();
&&&&&&&LocalBuilder&methodInvocation&=&ilGenerator.DeclareLocal(typeof(IMethodInvocation));
&&&&&&&ilGenerator.Emit(OpCodes.Ldarg_0);
private&void&GenerateConstructor()&&//&生成构造方法
&&&&&&&&try
&&&&&&&&&&&&MethodAttributes&methodAttributes&=&MethodAttributes.P
&&&&&&&&&&&&CallingConventions&callingConventions&=&CallingConventions.S
&&&&&&&&&&&&m_BaseConstructorParams&=&m_EmitClassInfo.ConstructorArgumentsT
&&&&&&&&&&&&m_ConstructorParams&=&new&Type[m_BaseConstructorParams.Length&+&1];
&&&&&&&&&&&&m_BaseConstructorParams.CopyTo(m_ConstructorParams,&0);
&&&&&&&&&&&&m_ConstructorParams[m_BaseConstructorParams.Length]&=&typeof(IInterceptor);
&&&&&&&&&&&&m_constructorBuilder&=&m_TypeBuilder.DefineConstructor(methodAttributes,&callingConventions,&m_ConstructorParams);
&&&&&&&&&&&&m_EmitClassInfo.Constructor&=&m_constructorB
&&&&&&&&&&&&m_IlGenerator&=&m_constructorBuilder.GetILGenerator();
&&&&&&&&catch&(Exception&e)
&&&&&&&&&&&&throw&e;
&&& 使用Emit不仅仅可以实现AOP框架,还可以根据用户需要自动生成任何IL代码。这些IL代码不会受到VB.net、C#的限制。因此,用户可以通过Emit来优化生成的中间语言代码,并完成一些C#无法做到的任务。如果读者想了解Emit的详细用法,可以参考MSDN或其他的相关文档。笔记总结:《魔比斯环》一部cg电影是如何诞生的(一) - 简书
笔记总结:《魔比斯环》一部cg电影是如何诞生的(一)
一:首先要有故事二:2d前期设计:主角,配角,场景,动物,植物,建筑,交通工具,武器,特效设计三:故事板:一稿潦草,二稿详细。每一秒都要有1~2格的故事板。贴近导演的想象,最好导演自己画。90分钟的电影要多达5000格故事板。你的构图合理,漂亮,三维建模出来的场景才会好看,有气势。画小图时,最重要的是:编故事板,表演,用镜头,控制时间的节奏。细绘时,画面要相对精细,定好镜头,角色在镜头中的站位,摄像机的运动,表现画面构图的美感,大致的敏感效果和氛围,角色的表演。故事板的制作流程:拿到剧本熟读并分析之熟悉二维设计导演与故事板组开会,说出想法和期待看到的镜头效果开始工作,根据成员长处分配场次,分别绘画。先画小图再次与导演开会小图通过,画的更精细。不通过,重画小图,重复3~5画师讲解,导演修正故事板的要求创作第一,绘画其次镜头,透视,摄影机动作表现好,为后期镜头规划有了明确的方向构图合理,漂亮,三维建模才会好看有气势角色,动作画得生动,三维动画才能得到明确的情绪感受。明暗画到位,三维灯光师才知道在哪个镜头里需要如何打光衬托氛围画得越细越好四:场景&道具DeepPaint3D绘制纹理贴图,然后使用3dsmax的置换功能生成山体模型,最后导入Maya中修改得到最终模型。先熟悉2d模型,再看故事板,对照考虑2d模型能否完成故事板中需求,改进。五:角色角色包括人类,外星人,动物涉及到的一系列表情动作。建模师建立所有角色身体模型,和多套服装模型。建模师对每个角色制作了3套模型:没有经过细分处理的高精度模型用于快速制作动画的切片模型用于衣服布料碰撞的解算模型每个主要角色需要制作约60个表情,16种发音口型,次要15~35个表情,不等的发音口型。每个角色大约60个目标体。混合目标体形成表情。统一命名,规范命名。
刘利刚 中国科技大学 http://staff.ustc.edu.cn/~lgliu 【前言】 自半年前笔者发表博客“什么是计算机图形学”以来,时常有人来向笔者询问3D模型的构建方法与工具。笔者的研究方向是以3D技术为主,具体包括3D建模,3D处理及3D打印三个方面,在3D...
前言 也许你已经在生活中见识过AR(即增强现实)技术所带给你的神奇感受了,肯德基搞过的魔法小精灵活动,腾讯QQ做过的火把传递,还有百度、阿里等都推出了自己的AR试水产品,应该都曾让你眼前一亮。作为一个旅游类ar应用开发的从业者,一年时间越坑不少思考很多,如果你也想了解或者想...
三维动画已成为全球性大型产业,它所带来的经济效应与影响力日趋增强,三维动画在我国的发展受到极大的关注。但是,它在我国的发展遇到了很多困难,缺乏专业人才,人才培养不够系统,剧本没有创新,缺少本土品牌等。三维动画制作的人员一定要有坚定信念,努力学习;从事三维动画的培训机构为动画...
王宝强再谈离婚:别把老实人逼到极限 也是没办法 日 星期日 09:42 AM Sina Weibo WhatsApp Email 日,农历腊月二十六,湘潭。 步步高广场临时搭起的舞台前,只看得见黑压压的人头。广场紧挨着城市繁华地带的十字路...
安装虚拟环境 $ pip install virtualenv 1 为项目创建虚拟环境 $ cd my_project_folder$ virtualenv venvvenv是虚拟环境的名字,随意起名。 2 使用虚拟环境前需要先启用它 $ source venv/bin/a...
http学习笔记 1. 什么是Http? Hypertext Transfer Protocol-超文本传输协议 HTTP是一个应用层的协议 2. Http的历史版本 HTTP/0.9;HTTP/1.0;HTTP/1.1(文档);HTTP/2.0(Http2.0的文档) 3...
文革已经过去五十年了,现在有很多人提出要反思文革,连人民日报也发文说要以史为鉴。 勿忘国耻嘛,反思文革,我觉得自然必要的,但是从哪个角度来反思呢?是老调常谈,三七开评价毛泽东的功与过?还是翻出诸如刘少奇、彭德怀等人的那些冤案来晒太阳?哪些是对当下有意义的反思呢? 我平时喜欢...
欢乐颂中,曲筱绡对于真本事和真性情有一段绝妙的说法。邱莹莹失恋以后,她和樊胜美遇见了同坐电梯的曲筱绡。在电梯上两个人又斗起了嘴, 曲筱绡道,你没脾气,你真性情,可是你没点真本事,谁愿意看你的真性情。世界这么残忍,鼓励有什么用。除了你自己,没有人有义务让你高兴。 曲筱绡说话向...
脸与心脏之间 竖着一堵墙 众神正趴在墙上 偷看女鬼洗澡用犀牛rhino怎么做魔比斯环?_百度知道
用犀牛rhino怎么做魔比斯环?
我有更好的答案
这样正方形旋转到最后又和第一个重合画一个圆,然后把正方形挨个作为截面loft成型。好像转动不需要360度,90度的话,正方形就可以转到原来的状态了,等分至少8份左右,然后每一个等分点上做一个正方形,然后正方形按照等差数列角度旋转,角度360/份数
采纳率:45%
画长方形条,画中轴线,扭转180度,画圆,沿曲线流动(flow),ok
什么叫魔比斯环?
为您推荐:
其他类似问题
魔比斯环的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。这是一个关于一个勇敢且足智多谋的14岁男孩,随着长大而拒绝接受父亲失踪的故事。由于对自己的观念深信不疑,他到达了拉菲卡星球,一个距今数百万光年的星球。他发现自己的父亲被囚禁在一个令人难以相信的魔法的,类似于中世纪骑士时代的巨人王国里。在一场关于正义与邪恶的巨大战役中,杰克营救了他的父亲,并最终在拉菲卡这个巨人星球上建立了新的家庭。...
这是一个关于一个勇敢且足智多谋的14岁男孩,随着长大而拒绝接受父亲失踪的故事。由于对自己的观念深信不疑,他到达了拉菲卡星球,一个距今数百万光年的星球。他发现自己的父亲被囚禁在一个相信的魔法的......
好看的科幻电影
生化危机5:惩罚
侏罗纪世界
星球大战7:原力觉醒
超凡蜘蛛侠2
生化危机6:终章
神秘翼龙岛
生化危及之丧尸桥
星球大战外传:侠盗一号
X战警:第一战
人怕出名猪怕壮
宇宙有爱浪漫同游
三块广告牌
灵魂当铺之时间典当
点燃欲望之火!抖奶超模海边嬉戏手抚性感酥胸
请选择播放源
打开UC浏览器极速观看什么是“魔比斯环”_百度知道
什么是“魔比斯环”
据说通过“魔比斯环”能瞬间到达宇宙任何地方,理论依据是什么,电影里讲了一下,但我没怎么听明白。
我有更好的答案
失去距离。这样俩边就可以“瞬间到达”。虫洞理论就是指“四维球体”(即宇宙的假想形)的这种“凹陷”,这样可以使任意俩个地点失去距离。其实这对于我们来说是不可理解的,只是一种理论上的概念,即从圆环上的任一点,我们也无法理解它的形状。比如一个三维球,不离开这个二维面进行运动,可以到达圆环上其他的任何地方。从宇宙任一点出发,朝向某个特定的方向前进,可能有一天会又回到地球。。这个特点使莫比乌斯圆环拥有了一个特殊的性质。即使是,把它对顶的俩端向内凹陷,宇宙无界,并且是一个三维“环”(或球)。至于瞬间到达任何地点,那是虫洞理论,在三维空间中的类二维物体都是有正反俩个面的。因为我们的思维局限于三维世界,无法直观的想象四维世界。也许有一天,我们的科学家们可以找到描述宇宙模型的方程,到一定程度会使俩边粘在一起。而且宇宙是否是“四维球体”还不一定。这对于普通的类二维物体来说是不可能的。莫比乌斯圆环启发了宇宙学家,很多宇宙学家认为宇宙可能是一个三维“球体”或者三维“莫比乌斯圆环”,也就是说。它的特点是只有一个面。而普通的莫比乌斯圆环就是指把一个纸带一端反转180度然后俩头粘在一起。属于拓扑学范畴
采纳率:30%
很难听明白取一个纸条,我们很容易就能把它粘成一个普通圆环,但是我们在粘接的时候把某一端反转180度,再粘接,就形成里莫比斯环这样我们就可以不跨越边际就到到达纸条两面的任意一面扩展到宇宙就是想通过某种装置,把宇宙扭曲,使得遥远的两点达到距离尽可能近的程度
先更正一下,是墨比乌斯环.你可以自己动手做一个,具体方法是:拿一条纸带,把它扭转一百八十度后头尾粘起来,然后拿一支笔,随便从那一面起沿着纸面的中线画下去.等到与你画的起点重合时,你会发现正反面的线是一条封闭的曲线.也就是说,你沿着环面走总可以不用穿过环面就可以达到另一面.假设宇宙是一个墨比乌斯环的形状的话,那就可以到达宇宙的任何空间了.
Mobius带是不可定向曲面,学微积分就会清楚
现有科学论断与人类幻想结合而产生的一个模型,却不一定能够说明客观实际。
你指的是动画片??
其他3条回答
为您推荐:
其他类似问题
魔比斯环的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 魔比斯环3d 的文章

 

随机推荐