“ 碎片化的知识只会让人焦虑,系统化的知识才能改变命运,我曾经说研究社群商业模式就做一张未来商业的拼图,经过5年来持续的研究与实战,30多期的《社群商业模式班》授课,300多节线上课程的研发,我想告诉大家-这张拼图我已经完成了。
这张图历时5年研究,每个月都在更新,其中3.0版的创作与设计就花了两个月的时间,每一个名词,每一个流程,我们的讲师都是反复推敲;每一个图标,每一个箭头,我们的设计师都要反复修改。今天,我们终于完成了,希望第一时间分享给你!”
——廖桔
在今年的四月份,我们上线了《廖桔-社群商业模式藏宝图》3.0版,一经发布,引发疯抢,前三个月已经被订购3万份。
在这个过程中,我们仍旧在对藏宝图不断进行改良,精进和优化,终于在6月份成功升级《廖桔-社群商业模式藏宝图》3.5版,并于7月1日正式发布,希望有更多的企业家和创业者能更系统化、精准化的学习社群商业模式。
(《廖桔-社群商业模式藏宝图》3.5版发布)
(全新板块)
该版本修正了之前不够完善的部分,优化了设计版式,为了保护藏宝图,还改用了全新的精美卷轴滚筒包装。
(全新包装)
为什么要打造“社群藏宝图”
“吸粉难、成交难、留人难。”在行业竞争日益白热化的时代,这三大难题足以让一家企业快速衰落,因为没有客源,就等于死路一条。
为了不被市场淘汰,越来越多的企业选择转型社群,想通过社群做到快速吸粉锁客,但是看了很多“大咖”,“社群导师”的文章,甚至付费的课程,还是做不好找客源这件事,甚至还被指引到了错误的方向,浪费了大量时间。
很多企业就这样在迷茫中,探索中,压力中开始怀疑自己,最后慢慢放弃了。
市面的社群课程的主要问题:
1.课程复杂高深抽象,有基础会学有所成,但小白会越看越懵;
2.看似干货一堆,可不注重实操,无法落地;
3.行业共同认可的社群实战派导师,实在屈指可数,真实案例少的可怜。
廖桔深知这些问题的严重性,所以在桔子有的课程中,都非常注重与实战经验的结合,而今天这张《廖桔-社群商业模式藏宝图》3.5版,就是廖桔历时5年,将关于社群商业模式系统化的全部知识体系,用这一张图完整的呈现出来。
目的
1.帮助企业建立社群商业模式
2.帮助企业建立社群运营体系
3.帮助从业者系统化学习
社群掘金秘籍,全面解析
这是一张什么图?
1.廖桔5年社群研究之力作
2.帮助企业持续赚钱的藏宝图
3.每一个企业老板必备的转型秘籍
设计图的内容模块
一个核心理论
3大运营公式
l 会员人数=触达人数x吸粉转化率x成交转化率x会员转化率
l 终身消费=购买频次x平均生命周期x平均客单价
l 裂变人数=∑(推荐人数^裂变级数)
8大知识体系
l 创始人发心:发心是一切商业的起点,也决定了你的终点。
l 品牌体系:平台品牌之下的产品品牌矩阵+个人IP矩阵。
l 社群团队规划:外部客户自循环,内部团队自运转。
l IT系统规划:微信矩阵链接所有会员,会员系统管理所有数据。
l 粉丝运营:主动就是被动,被动就是主动。
l 客户运营:制造排队就是高转化成交场景。
l 会员运营:仪式让会员重视,特权让会员复购。
l 合伙人运营:运营合伙人就是运营推荐关系。
11个社群运营方
最小经营单位理论
自运转构架理论
赋能与控制理论
信息病毒理论
制造排队理论
客户关系递进理论
特权营销理论
杂货铺理论
推荐关系理论
愉快成交理论
成交场景递进理论
涵盖600多个知识点
企业家转型必备
藏宝图的核心优势
l 服务上千家企业的咨询经验,更具实战性!
l 独创理论、原创著作,更具实操性!
l 十年一线市场实操经验,更具落地价值!
l 全流程设计、整体化解决,更具竞争优势!
l 全球化视野、系统化理念,更具增长效果!
你将收获
l 掌握一整套的社群运营工具方模型,简化50%的运营繁琐工作
l 社群运营留存增长法则,让流量不再是难题
l 微信成交方法,持续变现秘诀,照着做都能学会
l 极致专业的桔子会团队,有问必答
适合人群
l 想掌握社群最实用运营体系设计
l 想学习从0到1孵化社群运营团队
l 想打造可持续变现的社群
大咖都认可的实力派
当你还在抱怨社群能不能做?质疑到底能不能做好的时候,别人已经甩你几条街了!三个月的时间里,我们收到了非常多会员反馈过来的评价,大家对藏宝图都非常认可,也对廖桔的系统化思维感到敬佩。
聚宝赞创始人-毛若江说藏宝图帮助企业规划出未来发展的路径;闽郎世家创始人-陈炳展说藏宝图明确指出自己创业数年不足的地方;E店创始人-陈涛说藏宝图为转型中的电商企描绘了一张未来的发展蓝图;调皮电商-冯华魁说廖桔提出的客户自循环理论,可以成为像《定位》一样重要的商业理论……(会员反馈)
已购会员与廖桔合影
从0到1,创造一个新品牌,拿下第一个1000万成交,要多久?
高端衣物护理品牌“绽家”的经验是,大半年。其母公司“若羽臣”在做天猫品牌服务商时,通过数据洞察到,内衣洗护赛道存在新机会,创立新品牌“绽家”,两年多的时间,营收超过2个亿。
主打年轻人零食的“青城山下白素贞”天猫旗舰店的答案是,4个月。2022年4月创立品牌,同年8月开通天猫旗舰店,把芝麻丸这个看似“过气”的产品打造成了年轻人的爆款零食,4个月内,成交业绩突破1000万。
AR眼镜品牌XREAL的答案则是1个晚上。风靡国外的XREAL,2022年8月在天猫开业,举办中国首场AR眼镜发布会,8月27日首销日,XREAL天猫平台销售额突破1200万,创下天猫XR品类单日销量与销售额的双历史记录。
2023年二季度,天猫平台新入驻商家数量同比增长75%,超过去年上半年新商数量。其中,45%为产业带品牌,20%为新消费品牌。这批天猫新入驻商家中,3个月内,成交规模突破1000万元的有近30个,突破100万元的近700个。
在很多人认为新消费热潮退却,新品牌的机会不再,为何在天猫平台,新消费创牌、独角兽依然层出不穷?当前经济形势下,这些新品牌是如何逆袭的?当下新品牌创业的关键因素有哪些?为了探究这几个疑问,我们和三个新品牌的相关负责人聊了聊。
01 主动“自卷” 品牌服务商变身创牌者若羽臣,一个几乎是伴随淘系电商成长的名字。业内更多的认知是在服务商的角色。在2020年,完成深交所上市后,若羽臣开始探索身份的转变——从品牌的服务者,变成创牌者。
若羽臣在经营不同品牌客户时,通过淘系等平台的数据洞察认识到,一个机会出现在家清行业——内衣洗护赛道。
为了加速创牌,若羽臣2019年收购了新西兰的一个美护集团,作为该集团旗下的品牌之一,若羽臣正式将LYCOCELLE带到了中国市场,以绽家的名字开始全新的旅程。
在若羽臣看来,相对于其他电商平台,天猫优势在于用户购物心智、消费能力以及品牌粘性。这种优势正是白牌商家、新品牌迅速积累用户、实现品牌化的重要因素,也是具有足够潜力的产品能够突围的核心渠道。
若羽臣相关负责人黄琳涵表示,“天猫是品牌长期发展的经营阵地,如今品牌的冷启动,需要具有全渠道、全链路布局的能力,包括站外内容种草、营销推广等多种行动的配合,做好站内外联动,才有可能更充分地触达潜在用户。”
在天猫店铺成立后,首款产品是重中之重。绽家的解题思路,是围绕着用户需求,找到用户真实需要。
“我们发现,过去很多消费者动辄就囤积几大桶洗衣液,半年不复购。但也有相当一部分消费人群倾向于小巧精美的产品,他们注重功能也注重成分,关注产品质量也在意服务体验,是典型‘从有向优’升级的代表。”
对此,放弃大桶,绽家将内衣洗液产品规格设定得更加精致,如一瓶经典内衣洗液为300ml。
同时主动“自卷”,在包装设计和香氛上下足功夫,从视觉和香味上加强品牌记忆点。
就产品侧而言,绽家打爆新品,一方面是跳脱出传统行业卷价格、卷容量的桎梏,真正基于消费者细分需求出发,在产品上不断打磨,同时将产品优势深度提炼,打造差异化卖点,并将之可视化,除产品评测等维度内容,也强调在情绪价值层面的用户沟通。
另一方面,基于后台数据的消费者洞察,寻找更能打动消费者的表达形式。比如“专衣专护”概念,提倡不同衣物洗护存在细分需求,并通过天猫生态内的媒介投放,精准触达站内外不同人群,将其沉淀为品牌的用户资产,在大促、上新等节点引爆。
“一个爆品吃三年的电商时代已经过去,现在能够吸引消费者的,是真实的产品质量和品牌认可。”黄琳涵透露,在用户站内外的各类数据信息反馈中,绽家会努力找到用户的真实痛点,进而对产品进行研发改良。
除此以外,绽家也在持续推进从爆款到爆款群的深化。在坚持打造主爆款作为品牌的核心产品壁垒之外,绽家也参考新品测试等方式,持续寻找下一个具有爆款潜力的产品。比如继内衣洗液之后,绽家全新推出的香氛护衣喷雾产品,上线仅2个月累计销售破40万瓶;精油洗衣凝珠也长期冲登天猫细分品类销售前三名,今年推出的新品地板清洁水上市首月即赢得众多用户好评,月销破百万,并冲登天猫细分品类TOP1。
天猫作为成熟电商生态的价值,在这里得到进一步印证。在黄琳涵看来,天猫最大的一个特质在于,流量的相对稳定。
天猫平台的流量,散布在不同场景与入口,对应着不同人群、消费习惯,需要品牌方及商家综合考量整个平台的流量获取及站内外联动。而稳定的点在于,在不同场景的转化中,品牌方有了更为“平等”的竞争关系。“无论新老玩家,只要具备与时俱进的全渠道、全链路营销及运营能力,都有机会获得成长。”
在稳定的流量模式基础上,天猫的数据洞察更能反映用户的真实需求,从而指引品牌创新的方向,带来品牌的长期健康发展。
02 坚持品牌理念 “过气”产品打造成新成爆款杭州生活的人们或许会有印象,在2019年,一家名为“青城山下白素贞”的餐厅正式开业,一度成为网红打卡点。
青城山下白素贞,洞中千年修此身。
《新白娘子传奇》中的经典插曲,成为一个休闲零食新品牌后,“修炼成道”的时间或许并不需要千年。很多人不知道的是,餐厅和零食品牌背后有同一个创始人徐瑞东。他是青城山下白素贞的创始人之一,也是沸腾鱼乡的合伙人之一。
线下生意受到疫情影响,徐瑞东开始寻找出路。2021年,一场久违的线下行业展会上,作为老饕的他在一众零食品牌、代加工工厂中失望而归——产品太过常规,并没有让他眼前一亮或者记忆犹新的产品。
“没有,那我就自己做。”徐瑞东跨入休闲零食领域的契机,是为了做自己爱吃的口味。所以在作为零食品牌的“青城山下白素贞”成立之前,已经开始尝试不同的产品。
最终锚定的赛道,茶点和咖点类休闲零食。2022年4月,品牌正式成立,同年8月,品牌天猫旗舰店整体运营规划完成,开始经营售卖。品牌定位,是只做健康,好吃的新零食。
或许是经营过品牌餐饮,徐瑞东对于发展有一点非常明确,一定要做品牌,“而想做品牌,第一家线上渠道一定是天猫。”
芝麻丸这类看似已经“过气”的产品,是青城山下白素贞的第一个爆款。作为新品牌,天猫小二提供了近乎管家式的服务,什么品类还有机会?什么产地原料更为合适?什么口感更适合大众?老品牌的商业逻辑如何运转?在与小二的密切沟通中,徐瑞东的用户认知开始转变。
他同样较真。在安徽宣城找到认为最合适的芝麻后,帮助宣城当地做检测、分级别。而在完成产品后,实现爆款的路径在天猫能找到很多条。比如与蜜蜂惊喜社的直播合作,通过达人直播间种草推广与天猫营销大促结合的方式,找到产品被消费者认可的最大公约数,以尽可能快的速度,找到能够打爆的商品。
在徐瑞东看来,成熟的直播间更像是一个新消费品牌的“孵化器”。结果就是,在天猫店上线不过4个多月,销售业绩已经突破1000w。
业绩做的好,徐瑞东觉得并不意外。他在天猫上还有一个追求,打造出更多的特色来。
“很多产品其实很好,但是作为品牌来说,太单一。”这是徐瑞东的视野。新品牌反而更不需要边界,青城山下白素贞作为品牌的产品战略,一方面是对于原料品质的追求,另一方面则是对中华各地域特色食材的加工和营销,来打造独具特色的产品矩阵,比如江淮糯米做的锅巴、汉川莲藕做的藕粉等等,提升品牌心智。
打造品牌心智一方面依赖的是创始人徐瑞东自己的坚持,“我想分享更多中国味道给更多人,我也想分享更多我喜欢的口味给更多人”。这导致了许多产品的销量并不算爆款,甚至一开始某些产品就不是为了爆品去的。却让许多年轻人对青城山下白素贞抱有极大的好感度,认为这是一个宝藏店铺、宝藏品牌。
另一方面,则是天猫对于消费人群的集中,即使再小众的产品,也能精准的找到拥趸。站内人群的准确触达,配合直播间,迅速找到新产品匹配的受众。同时,售后、品类成熟度,甚至不同达人直播间自带的选品逻辑,都是消费者与品牌建立联系的绝佳入口,也是品牌建立消费者信任的桥梁。
徐瑞东坚信不疑,并且将在天猫继续坚持自己的品牌定位与调性。“消费者信任天猫,从很大意义上来讲,‘天猫即品牌’。”
03 找到数码发烧友 新品牌首战一夜成名有人从0到1,有人顺势引爆。
2017年1月,以创始人徐驰为首的团队里,电子工程博士、光学科学家、计算机视觉科学家、软件研发专家……一群敢于挑战未知的探索者开始向消费级AR(增强现实)发起挑战。
此后数年里,这群博士、专家创立了XREAL(原Nreal)。这一品牌的AR眼镜,开始频繁出现在各类行业展会上,风靡海外。2022年,XREAL开始回到国内市场,选择的首发站点,依旧是天猫。在2022年8月27日首销日,XREAL天猫平台销售额突破1200万,创下天猫XR品类单日销量与销售额的双历史记录,直接行业登顶。
时间拨回2022年8月前,XREAL一站成名前也面临诸多挑战。“作为小众行业的新品牌,在当时面临的问题,一是在国内缺乏品牌认知,二是品类心智缺乏聚集圈层,我们在思考如何快速在国内市场破圈。“XREAL相关负责人回顾道。
在与天猫小二交流后,天猫组织了专门的扶持团队,来与XREAL团队做新品首发的共创。
“对于一些新趋势品类,无论是品牌营销方法还是站内资源,天猫会安排专人协助。XREAL天猫店铺正式上线与新品首发,筹备了2个月。”天猫XR行业小二木王的印象中,光线上线下的会议加起来,就至少开了20多次。
在XREAL品牌上线和新品首发中,在人群触达上做了深入的探讨,当时的结论是,先打核心圈子,再往外拓展。XREAL的第一波市场投放首选选定了数码发烧友,凭借阿里妈妈的产品的工具定制了相应的人群包。
去年8月23日新品Air发售,让木王记忆深刻还有与XREAL一起共创了“创始时空契约礼盒”。前1000名买XREAL Air AR眼镜创始礼盒的用户,跟随货品会收到一张时空契约券,可以等额兑换2023年发布的AR眼镜新品。这个一起共创的营销玩法,让XREAL在天猫上锁定了第一批客户。
新品首发是XREAL在国内市场的成名日。已经成为国内市场新品首发阵地的天猫小黑盒,有比较强新品首发心智,带来不少流量增量。8月23日新品首发期间,天猫小黑盒给店铺带来了超过20万的访客,吸引了大量的用户关注和加购。
“对于有潜力的、代表未来趋势的商家,天猫愿意投入资源,帮助他们进行孵化。尤其是对于像XR设备这种新趋势品类,选择在天猫创牌基本上是必经之路。”木王称。
“天猫对于新品牌的价值在于,能够提供足量的营销策略支持和资源扶持,来陪伴品牌快速实现0-1的跨越成长。”XREAL相关负责人表示。
现如今,XREAL拥有了两家天猫店铺。两个店铺都销量一路高升。“XREAL Air 2系列新品AR眼镜,也会在今年九、十月份上线。”对于新品的持续打爆,XREAL表示,已经成为一种可以预期的“必然”。
04 来天猫认真做品牌这种新品牌个体成长的必然,正在成为平台范围内的确定。为了更好地助力新商家在天猫上的成长,近期,天猫先后发布了“蓝星计划”、“千星计划”等一系列商家政策,向新品牌们持续释放着利好。
“绽家在深化‘专衣专护’产品理念的同时,也在逐步扩展品类,以家居场景精细化需求为导向,开拓如地板清洁、洗衣机槽清洁等更丰富的家庭环境清洁产品。”黄琳涵表示。在完成几个爆品打造后,以小步快跑的方式,不断丰富产品矩阵,正在成为大众对于绽家品牌的实际认知。
而对于徐瑞东来说,在品牌力开始涌现的当下,他的想法很纯粹,“先研发更多的美食,让更多人看到、知道、尝到。”
入驻天猫,不是头脑一热,他们都在天猫认真做品牌。
一个商业共识是,流量是快消品,认知是耐用品。在多平台布局已成为标配的当下,商家竞争的维度,正在从单纯的争夺流量,转向争夺心智与认知的维度。
这意味着,从商家到品牌的成长,必须建立大众认知,或是品类认知。从而掀起从新消费到新品牌的迁移浪潮。
新品牌的商业故事,还在持续上演。而展示的舞台,又回到天猫的原点。
Facebook 近期将其母公司改名为 Meta,宣布正式开始进军 元宇宙 领域。本文主要讲述通过 Three.js + Blender 技术栈,实现 Meta 公司炫酷的 3D 动态 Logo,内容包括基础模型圆环、环面扭结、管道及模型生成、模型加载、添加动画、添加点击事件、更换材质等。
什么是元宇宙元宇宙 Metaverse 一词源于 1992 年尼尔·斯蒂芬森的 《雪崩》,该书描述了一个平行于现实世界的虚拟世界 Metaverse,所有现实生活中的人都有一个网络分身 Avatar。维基百科 对元宇宙的描述是:通过虚拟增强的物理现实,呈现收敛性和物理持久性特征的,基于未来互联网,具有链接感知和共享特征的 3D 虚拟空间。
元宇宙的内涵是吸纳了信息革命 5G/6G、互联网革命 web3.0、人工智能革命,以及 VR、AR、MR,特别是游戏引擎在内的虚拟现实技术革命的成果,向人类展现出构建与传统物理世界平行的全息数字世界的可能性;引发了信息科学、量子科学,数学和生命科学的互动,改变科学范式;推动了传统的哲学、社会学甚至人文科学体系的突破;囊括了所有的数字技术。正如电影 《头号玩家》 的场景,在未来某一天,人们可以随时随地切换身份,自由穿梭于物理世界和数字世界,在虚拟空间和时间节点所构成的元宇宙中生活学习。
实现效果进入正题,先来看看本文示例的实现效果。
在线预览:/d/file/gt/2023-09/v2qbunbwenz (由于模型较大,加载进度可能比较缓慢,需要耐心等待)
开发实现注意:上述示例动图展示的是试炼四,不想看试错过程(试炼一、试炼二、试炼三)的,可直接跳转到试炼四段落查看详细实现流程。失败流程中都列出了难点,知道解决方案的大佬请在评论区不吝赐教。
开发之前我们先观察一下 Meta Logo,可以发现它是一个圆环经过对折扭曲形成的,因此实现它的时候可以从实现圆环开始。
试炼一:THREE.TorusGeometryThree.js 提供的基础几何体 THREE.TorusGeometry(圆环),它是一种看起来像甜甜圈 的简单图形。主要参数:
radius:可选。定义圆环的半径尺寸。默认值是 1。tube:可选。定义圆环的管子半径。默认值是 0.4。radialSegments:可选。定义圆环长度方向上的分段数。默认值是 8。tubularSegments:可选。定义圆环宽度方向上的分段数。默认值是 6。arc:可选。定义圆环绘制的长度。取值范围是 0 到 2 * π。默认值是 2 * π(一个完整的圆)。语法示例:
THREE.TorusGeometry(radius, tube, radialSegments, tubularSegments, arc);
失败:没有找到扭曲圆环的方法。
试炼二:THREE.TorusKnotGeometryTHREE.TorusKnotGeometry 可以用来创建三维环面扭结,环面扭结是一种比较特别的结,看上去像一根管子绕着它自己旋转了几圈。主要参数:
radius:可选。设置完整圆环的半径,默认值是 1。tube:可选。设置管道的半径,默认值是 0.4。radialSegments:可选。指定管道截面的分段数,段数越多,管道截面圆越光滑,默认值是 8。tubularSegments:可选。指定管道的分段数,段数越多,管道越光滑,默认值是 64。p:可选。决定几何体将绕着其旋转对称轴旋转多少次,默认值是 2。q:可选。决定几何体将绕着其内部圆环旋转多少次,默认值是 3。语法示例:
THREE.TorusKnotGeometry(radius, tube, radialSegments, tubularSegments , p, q);
失败:没找到能够控制手动扭曲程度的方法。
试炼三:THREE.TubeGeometryTHREE.TubeGeometry 沿着一条三维的样条曲线拉伸出一根管。你可以指定一些定点来定义路径,然后使用 THREE.TubeGeometry 创建这根管。主要参数:
path:该属性用一个 THREE.SplineCurve3 对象来指定管道应当遵循的路径。segments:该属性指定构建这个管所用的分段数。默认值为 64.路径越长,指定的分段数应该越多。radius:该属性指定管的半径。默认值为 1.radiusSegments:该属性指定管道圆周的分段数。默认值为 8,分段数越多,管道看上去越圆。closed:如果该属性设置为 true,管道的头和尾会连起来,默认值为 false。代码示例
// ...var controls = new function () { // 点的位置坐标 this.deafultpoints = [ [0, 0.4, -0.4], [0.4, 0, 0], [0.4, 0.8, 0.4], [0, 0.4, 0.4], [-0.4, 0, 0], [-0.4, 0.8, -0.4], [0, 0.4, -0.4] ] this.segments = 64; this.radius = 1; this.radiusSegments = 8; this.closed = true; this.points = []; this.newPoints = function () { var points = []; for (var i = 0; i < controls.deafultpoints.length; i++) { var _x = controls.deafultpoints[i][0] * 22; var _y = controls.deafultpoints[i][1] * 22; var _z = controls.deafultpoints[i][2] * 22; points.push(new THREE.Vector3(_x, _y, _z)); } controls.points = points; controlsraw(); }; thisraw = function () { redrawGeometryAndUpdateUI(gui, scene, controls, function() { return generatePoints(controls.points, controls.segments, controls.radius, controls.radiusSegments, controls.closed); }); };};controls.newPoints();function generatePoints(points, segments, radius, radiusSegments, closed) { if (spGroup) scene.remove(spGroup); spGroup = new THREE.Object3D(); var material = new THREE.MeshBasicMaterial({ color: 0xff0000, transparent: false }); points.forEach(function (point) { var spGeom = new THREE.SphereGeometry(0.1); var spMesh = new THREE.Mesh(spGeom, material); spMesh.positionpy(point); spGroup.add(spMesh); }); scene.add(spGroup); return new THREE.TubeGeometry(new THREE.CatmullRomCurve3(points), segments, radius, radiusSegments, closed);}// ...
勉强成功:但是管道连成的圆环不够圆,实现完美的圆弧需要精确的坐标,暂时没找到坐标计算方法。
试炼四:Blender + Three.js虽然使用 THREE.TubeGeometry 可以勉强实现,但是效果并不好,要实现圆滑的环,需要为管道添加精确的扭曲圆环曲线路径函数。由于数学能力有限 ️,暂时没找到扭曲圆弧路径计算的方法。因此决定从建模层面解决。
成功 :但是手残的我使用 Blender 建模花费了大量的时间 。
建模教程逛 B站 的时候发现了这位大佬发的宝藏视频,刚好解决了自己的难题。
传送门:【动态设计教程】AE+blender能怎么玩?脸书元宇宙Meta动态logo已完全解析,100%学会
用Blender建模使用 Blender 进行建模,并导出可携带动画的 fbx 格式,导出的时候不要忘记勾选 烘焙动画 选项。
加载依赖<script src="./assets/libs/three.js"></script><script src="./assets/libs/loaders/FBXLoader.js"></script><script src="./assets/libs/inflate.min.js"></script><script src="./assets/libs/OrbitControls.js"></script><script src="./assets/libs/stats.js"></script>场景初始化
var container, stats, controls, compose, camera, scene, renderer, light, clickableObjects = [], mixer, mixerArr = [], manMixer;var clock = new THREE.Clock();init();animate();function init() { container = document.createElement('div'); document.bodyendChild(container); // 场景 scene = new THREE.Scene(); scene.transparent = true; scene.fog = new THREE.Fog(0xa0a0a0, 200, 1000); // 透视相机:视场、长宽比、近面、远面 camera = new THREE.PerspectiveCamera(60, windownerWidth / windownerHeight, 0.1, 1000); camera.position.set(0, 4, 16); camera.lookAt(new THREE.Vector3(0, 0, 0)); // 半球光源:创建室外效果更加自然的光源 light = new THREE.HemisphereLight(0xefefef); light.position.set(0, 20, 0); scene.add(light); // 平行光 light = new THREE.DirectionalLight(0x2d2d2d); light.position.set(0, 20, 10); light.castShadow = true; scene.add(light); // 环境光 var ambientLight = new THREE.AmbientLight(0xffffff, .5); scene.add(ambientLight); // 网格 var grid = new THREE.GridHelper(100, 100, 0xffffff, 0xffffff); grid.position.set(0, -10, 0); grid.material.opacity = 0.3; grid.material.transparent = true; scene.add(grid); renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); renderer.setPixelRatio(windowicePixelRatio); renderer.outputEncoding = THREE.sRGBEncoding; renderer.setSize(windownerWidth, windownerHeight); // 背景色设置为透明 renderer.setClearAlpha(0); // 开启阴影 renderer.shadowMap.enabled = true; containerendChild(renderer.domElement); // 添加镜头控制器 controls = new THREE.OrbitControls(camera, renderer.domElement); controls.target.set(0, 0, 0); controls.update(); window.addEventListener('resize', onWindowResize, false); // 初始化性能插件 stats = new Stats(); containerendChild(stats.dom);}// 屏幕缩放function onWindowResize() { camera.aspect = windownerWidth / windownerHeight; camera.updateProjectionMatrix(); renderer.setSize(windownerWidth, windownerHeight);}
想了解场景初始化的详细流程,可阅读我的另一篇文章《使用three.js实现炫酷的酸性风格3D页面》。
加载Logo模型使用 FBXLoader 加载模型,并设置模型的位置和大小。
var loader = new THREE.FBXLoader();loader.load('assets/models/meta.fbx', function (mesh) { mesh.traverse(function (child) { if (child.isMesh) { child.castShadow = true; child.receiveShadow = true; } }); mesh.rotation.y = Math.PI / 2; mesh.position.set(0, 1, 0); meshale.set(0.05, 0.05, 0.05); scene.add(mesh);});添加材质
本文 Logo 使用的是 MeshPhysicalMaterial材质,它是一种 PBR 物理材质,可以更好的模拟光照计算,相比较高光网格材质 MeshPhongMaterial 渲染效果更逼真。使用 THREE.TextureLoader 为材质添加 map 属性来加载模型贴图。下图是金属质感的纹理贴图。
var texLoader = new THREE.TextureLoader();loader.load('assets/models/meta.fbx', function (mesh) { mesh.traverse(function (child) { if (child.isMesh) { if (child === '贝塞尔圆') { child.material = new THREE.MeshPhysicalMaterial({ map: texLoader.load("./assets/images/metal.png"), metalness: .2, roughness: 0.1, exposure: 0.4 }); } } });})添加动画AnimationMixer 对象是场景定对象的动画播放器。当场景中的多个对象独立动画时,可以为每个对象使用一个 AnimationMixer。AnimationMixer 对象的 clipAction 方法生成可以控制执行动画的实例。
loader.load('assets/models/meta.fbx', function (mesh) { mesh.animations.map(item => { mesh.traverse(child => { // 因为模型中有多个物体,并且各自有不同动画,示例中只为贝塞尔圆这个网格添加动画 if (child === '贝塞尔圆') { let mixer = new THREE.AnimationMixer(child); mixerArr.push(mixer); let animationClip = item; animationClip.duration = 8; let clipAction = mixer.clipAction(animationClip).play(); animationClip = clipAction.getClip(); } }) })});
添加动画之后,不要忘了要在 requestAnimationFrame 中更新动画。
function animate() { rendererder(scene, camera); // 获得前后两次执行该方法的时间间隔 let time = clock.getDelta(); // 更新logo动画 mixerArr.map(mixer => { mixer && mixer.update(time); }); // 更新人物动画 manMixer && manMixer.update(time); stats.update(); requestAnimationFrame(animate);}展示加载进度
FBXLoader 同时返回两个回调函数,可以像下面这样使用,用来展示模型加载进程展示以及加载失败的逻辑实现。
<div class="loading" id="loading"> <p class="text">加载进度<span id="progress">0%</span></p><div>
var loader = new THREE.FBXLoader();loader.load('assets/models/meta.fbx', mesh => {}, res => { // 加载进程 let progress = (res.loaded / res.total * 100).toFixed(0); document.getElementById('progress')nerText = progress; if (progress === 100) { document.getElementById('loading').display = 'none'; }}, err => { // 加载失败 console.log(err)});
实现效果
点击更换材质监听页面的点击事件,通过 HREE.Raycaster 拿到当前点击对象,为了展示例子,我为点击对象更换了一种材质 THREE.MeshStandardMaterial,并赋予它随机的 color 颜色、metalness 金属质感以及 roughness 粗糙程度。
//声明raycaster和mouse变量var raycaster = new THREE.Raycaster();var mouse = new THREE.Vector2();function onMouseClick(event) { // 通过鼠标点击的位置计算出raycaster所需要的点的位置,以屏幕中心为原点,值的范围为-1到1. mouse.x = (event.clientX / windownerWidth) * 2 - 1; mouse.y = - (event.clientY / windownerHeight) * 2 + 1; // 通过鼠标点的位置和当前相机的矩阵计算出raycaster raycaster.setFromCamera(mouse, camera); // 获取raycaster直线和所有模型相交的数组集合 let intersects = raycastertersectObjects(clickableObjects); if (intersects.length > 0) { console.log(intersects[0].object) let selectedObj = intersects[0].object; selectedObj.material = new THREE.MeshStandardMaterial({ color: `#${Math.random().toString(16).slice(-6)}`, metalness: Math.random(), roughness: Math.random() }) }}window.addEventListener('click', onMouseClick, false);
更多关于网格材质的知识,可参考文章末尾的链接。
加载人物模型人物模型的加载流程和 Logo 模型加载流程是一样的。我添加了一个正在施展龟派气功的人物,没想到与 Logo 模型的旋转动画非常契合 。
loader.load('assets/models/man.fbx', function (mesh) { mesh.traverse(function (child) { if (child.isMesh) { child.castShadow = true; child.receiveShadow = true; } }); mesh.rotation.y = Math.PI / 2; mesh.position.set(-14, -8.4, -3); meshale.set(0.085, 0.085, 0.085); scene.add(mesh); manMixer = new THREE.AnimationMixer(mesh); let animationClip = mesh.animations[0]; let clipAction = manMixer.clipAction(animationClip).play(); animationClip = clipAction.getClip();}, res => { let progress = (res.loaded / res.total * 100).toFixed(0); document.getElementById('progress')nerText = progress + '%'; if (Number(progress) === 100) { document.getElementById('loading').display = 'none'; }}, err => { console.log(err)});
本文示例人物模型来源于mixamo,该网站有有上百种人物和上千种动作可自由组合,免费 下载。大家可以挑选自己喜欢的人物和动画动作来练习 Three.js。
总结本文中涉及到的主要知识点包括:
THREE.TorusGeometry:圆环。THREE.TorusKnotGeometry:环面扭结。THREE.TubeGeometry:管道。Blender: 建模。FBXLoader: 加载模型,显示加载进度。TextureLoader:加载材质。THREE.AnimationMixer:加载动画。THREE.Raycaster:捕获点击模型。如果你对源码感兴趣,请点赞+转发+关注+私信【logo】。
欢迎点赞+转发+关注!大家的支持是我分享最大的动力!!!