CG动画制作——实训项目前期工作(一)

本文介绍了CG动画制作项目实训的前期工作,包括剧本撰写、场景概念设计和Maya插件开发环境配置。剧本围绕‘勇者斗恶龙’的故事展开,使用Maya结合Python和C++开发插件增强功能。详细讲述了Maya Python的配置,如添加PYTHONPATH,下载并设置Maya Developer Kit,以及安装和调试MayaCharm。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目实训开始的第一周,组内进行的基本是动画的前期准备阶段的工作,包括剧本、人物设计、概念草图等。

我们的动画将以Maya为主,辅助后期合成和剪辑软件,以及部分live2D画面组成。

本周我们主要完成了以下三点工作:

①剧本撰写:

一个好的剧本是一部成功动画片的基础,有趣的剧本可能被失败的导演拍成无趣的影片,但是无趣的剧本再怎样也不可能变成有趣的影片。经过多次开会商讨,我们决定做一个有关架空世界下的“勇者斗恶龙”的故事,风格以中世纪为主,由于我们的CG动画时长只有3分钟左右,所以很难讲一个完整的故事,因此,我们决定着重描写巨龙来袭以及我们的主人公鼓起勇气反抗的故事。

在开篇的一分钟内,我们计划使用2D的骨骼绑定蒙皮技术,制作一段类似在羊皮卷轴上讲述的故事,来介绍背景,然后通过转场切入3D部分。

以下是最终拟定的剧本:

②场景概念设计:

黑龙:

黑龙是我们动画中最主要的表现部分,包括他的凶残、可怕与无敌,除了后期的特效渲染之外,前期也需要进行概念图设计,我们的组员将想象中的场景视觉化:

剧本中对于龙的力量是人类文明所无法控制的,最强的士兵在其面前不过蝼蚁,最锋利的刀刃也无法伤其分毫。

遮天蔽日的巨大身躯,所到之处充满了毁灭,象征着凶残和绝对的力量。

它曾经用火焰毁灭过无数的文明,站在城墙上,将天际染上火光……这就是这张图最初的设想。

小男孩儿:
作为剧本中人类世界的主人公,小男孩儿的定位就是胆小、软弱的外表,但是在最后获得勇敢的心。在剧本中,所有人都嘲笑他所相信的事情,但最后还是他的坚持获得了收获:

这个场景的设计意图是表现出男孩面对极大的威胁时的那份勇气和果决。

剧本中的小男孩拥有着远超其同辈人的对于时代以及人类命运的理解,他代表着勇敢去挑战自己命运的人,能想到其他人想不到的事情,并且敢于尝试。

 手持着用黑龙的鳞片打造的,被人当做摆设的“巨龙之魂”,在被火焰包围的大地上向黑龙奔去,这样的感觉。

③插件开发环境配置

Maya插件可谓是给Maya添加了很多强大的功能,它的插件主要是通过其自带的Mel语言实现的,除此之外还有Python和C++的PLuginWizzarrd也可以编写。

自带的mel不必多说,C++的插件也在之前使用过,本周主要进行的是PyCharm配置的开发

#ifndef JPEGDECODE_H #define JPEGDECODE_H #include "globalextern.h" typedef unsigned char BYTE; struct ImageComponentData { double value[3]; }; class MBitReader { public: MBitReader(BYTE* data,int currentDataIndex) { Data=data; m_currentBitPosition=8; m_currentDataIndex=currentDataIndex; } BYTE* Data; int m_currentDataIndex; int m_currentBitPosition; public: int ReadNextBit() { --m_currentBitPosition; if (m_currentBitPosition<0) { m_currentBitPosition+=8; ++m_currentDataIndex; } //if (m_currentDataIndex>632) theUI->label1->setText("Error!"); return ((Data[m_currentDataIndex]>>m_currentBitPosition) & 0x01); } void GoPreviousBit() { ++m_currentBitPosition; if (m_currentBitPosition>7) { m_currentBitPosition-=8; --m_currentDataIndex; } } int GetCurrentByte() { return Data[m_currentDataIndex]; } }; class MJpegDecode { private: struct _JFIFAPPOInfo { BYTE APP0[2]; /* 02h Application Use Marker */ BYTE Length[2]; /* 04h Length of APP0 Field */ BYTE Identifier[5]; /* 06h "JFIF" (zero terminated) Id String */ BYTE Version[2]; /* 0Bh JFIF Format Revision */ BYTE Units; /* 0Dh Units used for Resolution */ BYTE Xdensity[2]; /* 0Eh Horizontal Resolution */ BYTE Ydensity[2]; /* 10h Vertical Resolution */ BYTE XThumbnail; /* 12h Thumbnail Horizontal Pixel Count */ BYTE YThumbnail; /* 13h Thumbnail Vertical Pixel Count */ } JFIFAPPOINFO; struct _JFIFDQTInfo { BYTE DQT[2]; // 14h 量化表段标记 BYTE Length[2]; // 16h 量化表段长度 BYTE Identifier; // 18h 量化表ID BYTE QTData[64]; // 19h 量化表数据 } JFIFDQTINFO[2]; struct _JFIFSOFOInfo { BYTE SOFO[2]; // 9Eh 帧开始段标记 BYTE Length[2]; // A0h 帧开始段长度 BYTE BitCount; // A2h 样本精度bit位数 BYTE Height[2]; // A5h 图像像素宽度 BYTE Width[2]; // A3h 图像像素高度 BYTE ComponentsCount; // A7h 图像组件计数 BYTE YIdentifier; // A8h 亮度Y的ID号 BYTE YHVSamplingCoefficient; // A9h 亮度Y垂直和水平采样系数 BYTE YUsedDQTIdentifier; // AAh 亮度Y使用的量化表ID号 BYTE CbIdentifier; // ABh 色度Cb的ID号 BYTE CbHVSamplingCoefficient; // ACh 色度Cb垂直和水平采样系数 BYTE CbUsedDQTIdentifier; // ADh 色度Cb使用的量化表ID号 BYTE CrIdentifier; // AEh 色度Cr的ID号 BYTE CrHVSamplingCoefficient; // AFh 色度Cr垂直和水平采样系数 BYTE CrUsedDQTIdentifier; // B0h 色度Cr使用的量化表ID号 } JFIFSOFOINFO; struct _JFIFDHTInfo { BYTE DHT[2]; // B1h 哈夫曼表定义段标记 BYTE Length[2]; // B3h 哈夫曼表段长度 BYTE HTIdentifier; // B5h 哈夫曼表号 BYTE NBitsSymbolsCount[16]; // B6h (符号的二进制位长度为n)的符号个数 BYTE SymbolsTable[256]; // C6h 按递增次序代码长度排列的符号表 } JFIFDHTINFO[4]; struct _JFIFSOSInfo { BYTE SOS[2]; // 261h 扫描开始段标记 BYTE Length[2]; // 263h 扫描开始段长度 BYTE ComponentsCount; // 265h 扫描行内组件的数量 BYTE YIdentifier; // 266h 亮度Y的ID号 BYTE YHTTableID; // 267h 亮度Y使用的哈夫曼表ID号 BYTE CbIdentifier; // 268h 色度Cb的ID号 BYTE CbHTTableID; // 269h 色度Cb使用的哈夫曼表ID号 BYTE CrIdentifier; // 26Ah 色度Cr的ID号 BYTE CrHTTableID; // 26Bh 色度Cr使用的哈夫曼表ID号 BYTE Reserved[3]; // 26Ch 3个未知保留字节 } JFIFSOSINFO; private: struct HuffmanTable { int CodeOfFirstNLengthSymbol[17]; //长度为N的第个码字的整数值 int NLengthToSymbolsTableIndex[16]; //查表得到第个长度为N的符号位于符号表的索引 } HUFFMANTABLE[4]; public: int ReadJFIFInfo(const BYTE* const jfifData,int jfifDataSize); void DecodeData(int mcuStartIndex,BYTE* jfifData,int jfifDataSize,ImageComponentData*& targetBitmapData); void SetHuffmanTable(); void DecodeOneDUDC(MBitReader* myBitReader,double* DU,double& lastDC,int HTID); void DecodeOneDUAC(MBitReader* myBitReader,double* DU,int HTID); void DecodeOneMCU(MBitReader* myBitReader,int mcuXn,int mcuYn,int mcuWidth,int mcuHeight,double *DU,ImageComponentData* targetImage); void InverseQuantization(double* du,BYTE* quantizationTable); void InverseZigzag(double* sourceDU,double* targetDU); void IDCT(double* sourceDU,double* targetDU); void YCbCrToRGB(ImageComponentData* sourceImage,ImageComponentData* targetImage); public: int imageHeight; int imageWidth; int alignedImageWidth; int alignedImageHeight; struct HuffmanTableID { int dc; int ac; } HTID[3]; double DC[3]; int HSamplingCoefficient[3]; int VSamplingCoefficient[3]; int DQTID[3]; }; #endif // JPEGDECODE_H
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值