精华内容
下载资源
问答
  • 3. 标题定桩 该方法使用于背政治、法学等一大的内容 需要先为你要记忆的东西定一个标题(或者直接就是提问的问题) 案例:记忆56个民族 通过标题的每个字去对应4个民族进行联想出图 标题:中华人民共和国 各族...

    菲常记忆数字生命密码表

     

    对于数字记忆,记忆电话号码及车牌号,可以通过以下3点着手:

    1. 熟悉数字编码,将简单的数字转化成图片
    2. 寻找方法,即联想故事的方法
    3. 建立图片与图片之间的联系

    案例:速记电话号码

    13614821452我们这样记忆:
    1我们不需要去记忆,36就是山鹿,14就是钥匙,82是靶儿,52是鼓儿。我们可以这样联想:
    有一只山鹿,手里拿着一把钥匙,拆在了一个靶子上,然后钥匙掉了下来,掉在了一个鼓儿上面。
    18762716840中,87就是白旗,62是牛儿,71是鸡翅,68是喇叭,40是司令;我们就可以这样联想:
    我把一个白旗插到一只牛儿的身上,牛儿正在吃鸡翅膀,吃完了以后它吹喇叭,吹出来很多司令。
    
    15136472591:51是工人,36是山鹿,47是司机,25是二胡,91是球衣,就这样联想:
    一个工人骑着一只山鹿,碰到了一个司机,司机正在拉二胡,从二胡里飞出来很多球衣。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    案例:速记车牌号

    京A WH650
    转换:
    京A想成鲸带着一顶帽子(A想成一个帽子的形状)
    WH想成是一个锯和一把椅子
    65想成一个绿壶,想成是一个鸡蛋
    联想:副驾驶拿着一个锯,正在锯司机的椅子,司机吓得在座位下的绿壶里下了一个鸡蛋。
    闽G R9527
    转换:
    闽谐音就是农民的民
    GR是工人的首字母
    95是酒壶
    27是耳机
    联想:一个农民工人一边拿着酒壶喝酒,一边带着耳机听歌。
    
    冀E 641S7
    转换:
    冀谐音是公鸡的鸡
    E如果是小写,我们就理解成是鹅,
    64是螺丝,想象成一群鸡鹅在吃螺丝,
    1S我们就像成是一条蛇,
    7的数字编码是锄头。
    联想:鸡和鹅在吃螺丝,不料碰到了一条蛇,而蛇正在拿着锄头挖螺丝。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    案例:超市采购记忆商品价格

    皮鞋200.00元    200我们就想成说个望远镜,一只皮鞋里面放一个望远镜,一共是2个
    苹果8元        8的编码是眼镜,可以联想苹果戴着一个眼镜
    蛋糕6.9元      6.9想成69太极,蛋糕的形状是一个太极,中间有个点
    运动衣39元   39是山丘,我穿着运动衣跑到了山丘上
    帽子27元      27是耳机,我戴着帽子和耳机听音乐
    围巾34元      34是三丝,可以想成把围巾撕成了3条丝带
    手套14元      14是钥匙,手套里面塞满了钥匙
    手表270元    27是耳机,0想成鸡蛋,拿耳机捆住了手表砸鸡蛋
    书包18元      18是糖葫芦,书包里装满了糖葫芦
    台灯52元      52 是鼓儿,拿台灯打鼓
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    数字记忆训练是最常见,也是最重要的;为什么说数字记忆训练是最重要的项目呢?这有几个原因:

    第一,数字记忆训练是世界通用的。阿拉伯数字全世界都一样,不分国家和地域。 
    第二,数字是日常生活、学习和工作中很常见的内容,每个人都少不了要经常记一些数字资料。通过数字记忆训练,能让我们在记忆数字资料的时候更轻松、更高效。 
    第三,通过数字记忆训练,对中文词语的记忆训练也有很大帮助。因为数字编码本身就是中文词语。在记忆数字的时候,其实也就相当于在记忆中文词语。 
    第四,也是最重要的,数字记忆训练,能不断挑战我们的记忆速度极限,让我们在高速的清晰想象之中保持高度专注的状态,这对全面提高我们的学习能力,甚至对深入开发脑潜能,都有很大的帮助。

    2. 借助语句定桩法

    九月九日忆山东兄弟(王维) 
    独在异乡为异客,每逢佳节倍思亲。 
    遥知兄弟登高处,遍插茱萸少一人。

    案例:记忆56个民族(每一个字记2个民族)

    • 这一步要把各个字具体形象化,抽象的话很难回忆起来

      独(独眼龙):汉族、满族 
      画面出图:独眼龙满头大汗 
      在(寨):回族、蒙古族 
      画面出图:蒙古人都回山寨了

    3. 标题定桩法

    • 该方法使用于背政治、法学等一大段的内容

    需要先为你要记忆的东西定一个标题(或者直接就是提问的问题)

    案例:记忆56个民族

    通过标题的每个字去对应4个民族进行联想出图
    标题:中华人民共和国 各族同胞大团结
    例:中(钟):汉族、满族、回族、蒙古族
    画面出图:我背着一个钟满(满族)头发汗(汉族)地跑回(回族)蒙古(蒙古族)包 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4. 记忆宫殿法(最重要最实用的)

    “记忆宫殿”是一个暗喻,象征任何我们熟悉的、能够轻易地想起来的地方。它可以是你的家,也可以是你每天上班的路线。这个熟悉的地方将成为你储存和调取任何信息的指南。比如十个地点可以用身体的不同部分,10-20地点可以用地铁点、公交站点或火车站点,这些东西是你每天接触的,基本上不用特意去想。当然你也可以用游戏的地点来代替,只要选条你印象最深最熟悉的路线就行了。 
    你要知道这是快速记忆最基本的方法之一,但也是最有效的方法。你唯一需要做的就反复练习,当你掌握这种方法之后,会很容易从前向后,或从后向前进行复述。

    运用记忆宫殿法的五个步骤:

    ①选择你的宫殿

    首先和首要的,你需要选择一个你非常熟悉的地方。本技巧的有效性取决于你在脑海中轻易地再现这个地方并在其中漫步的能力。你必须仅仅用你精神的“眼睛”就能身临其境。 
    举例,一个较好的初步选择可以是你的家。请记住,你对这个地方的细节的再现越鲜明,你就能越有效地记忆。 
    其次,试着在你的宫殿里确定一条特别的路线,而不只是再现静止的场景。也就是说,想象对你家做一次详尽的巡视,而不只是简单地把你家图像化。就像我们将在下一步骤中看到的,这会大大增强本技巧的效果,如果你能按照确定的次序回想起物品的话。 
    对记忆宫殿的选择,这里还有一些行之有效的推荐,以及可以采取的路线:

    • 你所在城市的熟悉的道路。可能的路线比如你开车上班经过的,或其他你熟悉的街道的顺序。
    • 现在或者以前的学校。你可以想象从教室到图书馆的道路(或者是去街对面的酒吧,如果那让你铭记于心的话)。
    • 工作场所。想象从你的隔间到咖啡机,或者到你老板的办公室(这不难选吧)。
    • 风景。想象在附近一带散步或者你在公园里慢跑的路线。

    ②列出明显的特征物

    现在你需要注意所选场所里的明显的特征物。举例,如果你选择巡视你的家,大门应该是第一个引起注意的特征物。 
    继续在你的记忆宫殿里做虚拟漫步。进门之后,第一个房间里有什么? 
    系统地分解这个房间(你可以确定一个标准程序,比如总是从左看到右)。什么是下一个引起你注意的特征物?可以是餐厅中间的桌子,或者是墙上的一张画。 
    一边走一边继续在头脑中记录其他的特征物。它们中的每一个都将成为一个“记忆槽”,等下你就可以用来储存一个特定的信息。

    ③把宫殿牢牢印在脑中

    要让这个方法有效,最重要的就是要让这个地方或者路线百分之百地印在你的头脑中。尽你所能去记住它。

    ④联系

    就像大部分的记忆增强方式一样,记忆宫殿法通过形象化的联想起作用。过程很简单:你选择一个已知的图像——称为记忆挂钩——和你想记住的要素结合起来。对我们来说,一个记忆挂钩就是我们记忆宫殿里的一个明显的特征物。

    形象化联想的正确方式是: 
    疯狂的、滑稽的、讨厌的、不同寻常的、超凡脱俗的、生动的、荒谬的——总之,就是那些容易被记住的东西,乏味就是错。

    ⑤参观你的宫殿

    到这一个步骤,你已经记住了那些项目。但如果你是个新手,你可能还需要做一点复习,至少要把行程在头脑中演练过一次。

    如果你从同样的地方开始并遵循同样的路线,每当你看到途中选定的特征物时,要记的东西就会瞬间浮现。路线从出发到结束,注意那些特征物,并且在脑中重演场景。当你的行程终结,转过身从反方向走回你的出发点。

    案例:记忆圆周率小数点后50位

    首先寻找25个熟悉的记忆宫殿。在这里我选择人体、汽车和我家的客厅。收听音频的你,也可以寻找你所熟悉的记忆宫殿。 
    那么记忆宫殿分别为:

    一、人体
    1头发 2眼睛 3鼻子 4嘴巴 5脖子 6肩膀 7前胸 8肚子 9大腿 10小腿
    二、汽车
    11前轮 12车灯 13车标 14前玻璃 15车顶 16方向盘 17前座 18后座 19后备箱 20排气管
    三、客厅
    21门 22鞋架 23沙发 24茶几 25电视机
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    联想记忆:

    一、人体
    1头发-14(钥匙):头发上插着钥匙
    2眼睛-15(鹦鹉):眼睛上有一只鹦鹉
    3鼻子-92(球儿):鼻孔里滚出来很多球儿
    4嘴巴-65(绿壶):嘴巴喝绿壶
    5脖子-35(山虎):脖子被一只山虎咬住了
    6肩膀-89(芭蕉):肩膀上长着香蕉
    7前胸-79(气球):前胸捆着气球
    8肚子-32(扇儿):肚子上扇着扇子
    9大腿-38(妇女):大腿上坐着妇女
    10小腿-46(饲料):小腿踩在饲料里
    二、汽车
    11前轮-26(河流):前轮开到了河流里
    12车灯-43(石山):前灯撞到了石山上
    13车标-38(妇女):车标上坐着一个妇女
    14前玻璃-32(扇儿):一把扇儿挡住了前玻璃
    15车顶-79 (气球):车顶上挂着气球
    16方向盘-50 (武林):一个武林高手坐在方向盘上
    17前座-28(恶霸):前座坐着一个恶霸
    18后座-84 (巴士):后座上堆满了巴士
    19后备箱-19 (衣钩):后备箱放着很多衣钩
    20排气管-71 (鸡翅):排气管烤鸡翅
    四、客厅
    21门-69 (太极):门上画着太极图
    22鞋架-39 (山丘):鞋架上放着一个小山丘
    23沙发-93 (旧伞):一把旧伞放在沙发上
    24茶几-75 (西服):用西服擦茶几
    25电视机-10(棒球):棒球把电视机打破了
    展开全文
  • 产品需求分析神器:KANO模型分析

    千次阅读 2019-06-28 16:56:45
    任何一个互联网产品,哪怕是一个简单的页面,也会涉及到很多的需求,产品经理也会经常遇到这样的情况:老板,业务提的各种新需求一下子都扎堆,哪个需求对用户来说最重要,用户对我们的新功能是否满意?开发产品资源...

    任何一个互联网产品,哪怕是一个简单的页面,也会涉及到很多的需求,产品经理也会经常遇到这样的情况:老板,业务提的各种新需求一下子都扎堆,哪个需求对用户来说最重要,用户对我们的新功能是否满意?开发产品资源有限,开发、设计、测试人手总是不够用,这么多需求没办法都做,先做哪些需求?

          这些都不应该是PM拍脑袋想出来的,其实产品经理的基本要求就是在有限的资源上,通过优化产品设计,提炼出正确、有效的需求,尽量避免在后续的设计、开发中临时改需求,至少要做到框架级的需求不大改,那么如何不用大脑YY出来或者YY出来不至于那么不靠谱,真正从用户需求出发来梳理出需求层次以及需求优先级,并能进一步判断需求实现对用户影响程度呢?

          正如标题所示,使用KANO模型,能够有效帮你系统的梳理需求,做需求的分析和提炼,提高效率。

    一.什么是KANO模型分析法呢?

          KANO模型分析法是授野纪昭基于KANO模型对顾客需求的细分原理,开发的一套结构型问卷和分析方法。KANO模型是一个典型的定性分析模型,KANO模型分析法并一般不直接用来测量用户的满意程度,主要用于识别用户对新功能的接受度,帮助企业了解不同层次的用户需求,找出顾客和企业的接触点,识别使顾客满意的至关重要的因素。

    1、KANO模型的属性分类

          在卡诺模型中,将产品功能/需求和服务的特性分为五种属性:必备属性、期望属性、魅力属性、无差异属性、反向属性。

    (1)魅力属性:用户意想不到的,如果不提供此需求,用户满意度不会降低,但当提供此需求,用户满意度会有很大提升;

    (2)期望属性:当提供此需求,用户满意度会提升,当不提供此需求,用户满意度会降低;

    (3)必备属性:当优化此需求,用户满意度不会提升,当不提供此需求,用户满意度会大幅降低;

    (4)无差异属性:无论提供或不提供此需求,用户满意度都不会有改变,用户根本不在意;

    (5)反向属性:用户根本都没有此需求,提供后用户满意度反而会下降

          我们做产品设计时,需要尽量避免无差异属性、反向属性,至少做好必要属性、一维属性,努力做魅力属性。

    2、根据KANO模型进行用户需求分类

          根据KANO模型,我将其属性分类与用户需求优先级进行对应,便于实际应用,主要定义了三种:基本型需求(必备属性)、期望型需求(期望属性)、兴奋型需求(魅力属性),这三种需求根据绩效指标分类就是基本因素、绩效因素和激励因素。

    二.KANO模型实际操作流程

    1.设计问卷调查表并实施有效的问卷调查

          KANO问卷中每个属性特性都由正向和负向两个问题构成,分别测量用户在面对具备或不具备某项功能所做出的反应。问卷中的问题答案一般采用五级选项,按照:喜欢、理应如此、无所谓、勉强接受、我不喜欢,进行评定。

    例如:1、针对于电商购物车无货商品到货提醒功能,问卷设置正反两题:

    (1)如果我们在购物车中提供无货商品到货提醒功能,你的感受是:

    A.我很喜欢 B.理应如此 C.无所谓 D.勉强接受 E.我不喜欢

    (2)如果我们在购物车中不提供无货商品到货提醒功能,你的感受是:

    A.我很喜欢 B.理应如此 C.无所谓 D.勉强接受 E.我不喜欢

    2、问卷设置可以在实际项目中进行调整,比如最近在做音乐产品新功能点分析,主要出于功能实用性角度进行调研,为便于用户理解,把问卷选项进行调整:

    针对于歌单无损标识功能,您的想法是?

    (1)在歌单中加入该功能,您认为此功能实用性如何?

    A.特别实用 B.比较实用 C.一般 D.很不实用E.非常不实用

    (2)在歌单中不具备该功能点,对您的使用影响程度有多大?

    A.非常影响 B.比较影响 C.一般 D.影响很小 E.完全没有影响

    KANO问卷需要注意:

    ① KANO问卷中与每个功能点相关的题目都有正反两个问题,正反问题之间的区别需注意强调,防止用户看错题意;

    ② 功能的解释:简单描述该功能点,确保用户理解;

    ③ 选项说明:由于用户对“我很喜欢”“理应如此”“无所谓”“勉强接受”“我很不喜欢”的理解不尽相同,因此需要在问卷填写前给出统一解释说明,让用户有一个相对一致的标准,方便填答。

    我很喜欢:让你感到满意、开心、惊喜。
    理应如此:你觉得是应该的、必备的功能/服务。
    无所谓:你不会特别在意,但还可以接受。
    勉强接受:你不喜欢,但是可以接受。
    我很不喜欢:让你感到不满意。

    2.收集数据并清洗

    3.将调查结果的功能属性进行分类,建立原型;

    (1)KANO模型区分产品需求的操作方法介绍:原始数据处理阶段,需要注意是每个功能各个样本量针对正反两题确立属性。


    为了能够将质量特性区分为基本型需求、期望型需求和兴奋需求,然后按照正向问题和负向问题的回答对属性进行分类,具体分类对照下表。当正想问题的回答是“我喜欢”,对负向问题的回答是“我不喜欢”,那么KANO评价表中,这项质量特型就分为“o”,即期望型需求。如果顾客对某项特征正负向问题的回答结合后,分类为“M”或“A”,那么该因素被分别分为基本型需求或者兴奋型需求。

          其中R表示顾客不需要这种质量特型,甚至对该质量特性有反感;I类表示无差异需求,顾客对这一种因素无所谓;Q表示有疑问的结果,顾客的回答一般不会出现这个结果。除非这个问题的问法不合理,或者是用户没有很好的理解问题,或者是用户在填写问题答案时出现错误。

    简单说就是:

    A:魅力属性;O:期望属性;M:必备属性;I:无差异属性;R:反向属性;Q:可疑结果

    (2).确立功能影响程度究竟多大:Better-Worse系数-计算与使用

          除了对于Kano属性归属的探讨,还可以通过对于功能属性归类的百分比,计算出Better-Worse系数,表示某功能可以增加满意或者消除不喜欢的影响程度。

    计算公式如下:

    增加后的满意系数 Better/SI=(A+O)/(A+O+M+I)

    消除后的不满意系数 Worse/DSI=-1*(O+M)/(A+O+M+I)

          以上算法,就是把各个项目下每个字母对应的百分比放进去进行计算,得到两个系数。

    Better,可以被解读为增加后的满意系数。better的数值通常为正,代表如果提供某种功能属性的话,用户满意度会提升;正值越大/越接近1,表示对用户满意上的影响越大,用户满意度提升的影响效果越强,上升的也就更快。

    Worse,则可以被叫做消除后的不满意系数。其数值通常为负,代表如果不提供某种功能属性的话,用户的满意度会降低;值越负向/越接近-1,表示对用户不满意上的影响最大,满意度降低的影响效果越强,下降的越快。

          因此,根据better-worse系数,对系数绝对分值较高的功能/服务需求应当优先实施。

          以电商退换货中维修功能为例计算它的better-worse系数如下:

    better-worse系数计算过程

     

    (3)根据better-worse系数值,将散点图划分为四个象限,以确立需求优先级。

      以曾经做过的电商售后页面新增功能点举例说明,最后计算完所有功能点的better-worse系数,利用散点图得到如下结果:

     

    则极速退款功能是用户最为迫切需求,在线咨询客服功能对用户来说是必备功能,而相似功能对用户来说并不在意,可酌情考虑开发。 然后,产品经理得根据产品所处阶段进行产品需求文档的书写,之后就可以去找开发、设计童鞋跟进产品开发工作了。相信你自己梳理一遍需求后,再去找开发、设计评审时,你会自信、坚定一些。

    最后结语:

    1、KANO模型将需求分成“基础、扩展(期望需求)、增值(兴奋需求)”三层。可根据KANO模型建立产品需求分析优先级,运用到产品设计中就是要抓住用户的核心需求,解决用户痛点(基本型需求),在确保基本需求解决的前提下,给用户一些high点(兴奋型需求);

    2、但是就具体问题分析后发现用户对基本需求、期望需求、兴奋需求的优先级会根据产品在于用户内心的阀值有所变化,但兴奋需求有时候是超出用户预期的(或者根本不知道),所以我们可以引导用户;

    3、用户调研可能只能获取到期望需求(基本需求用户默认有),所以基本需求和兴奋需求需要靠自己深入调研;

    4、用户有时候并不知道他们到底想要什么,所以我们要做的是要在用户诉求中提取用户需求再转化成为产品需求。一句话,听用户的,但别照着做。

    5、需求会因人而异要做的是满足目标用户人群中多数人的需求;需求会因为文化差异而不同;需求会随着时间变化,昨天的期望型需求,甚至魅力型需求,到今天可能已变成了必备型需求。所以需要持续调研需求、产品需要持续迭代。

     

    展开全文
  • (这标题有些歧义的,这个几种是修饰几何体的,而绘制的方法只有一种 :D)   首先需要跟大家道声歉,上个周末因为浅墨个人的原因。没把想写的内容的思路整理好,所以就停更了一次。  好了,别的废话咱不说了,...

     

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  

    文章链接: http://blog.csdn.net/zhmxy555/article/details/8475261

    作者:毛星云(浅墨)    邮箱: happylifemxy@163.com   

     

     

     

    本篇文章里,我们对Direct3D之中几种几何体的简洁绘制方法进行了详细的剖析,最后依旧是提供文章配套的详细注释的demo源代码的欣赏,并在文章末尾提供了源代码下载。(这标题有些歧义的,这个几种是修饰几何体的,而绘制的方法只有一种 :D)

     

    首先需要跟大家道声歉,上个周末因为浅墨个人的原因。没把想写的内容的思路整理好,所以就停更了一次。

     好了,别的废话咱不说了,下面直奔本周主题~

     

     

     

    一、D3D中内置的几何体概述

     

     

     

    通过前面的讲解大家应该会发现,使用顶点缓存和索引缓存通过绘制三角形单元来绘制图形还是有一点复杂的,需要一定的想象力和大量顶点和索引的设置,我们一般很少去这样通过逐个设置顶点缓存和索引缓存来进行画面上几何体的绘制的。而比较人性化的是,Direct3D为我们提供了几种特殊的生成简单3D几何体的网格数据的方法。可以说是在我们学习从文件载入网格数据之前,为我们提供了很多便利,丰富了我们的学习时的图形素材。下面我们就来看看这几个快捷的几何体绘制函数,他们分别是立方体(Cube),圆环体(Torus),多边形(Polygon),球面体(Sphere),茶壶(Teapot)和圆柱体(Cylinder)。

     

    我们可以在DirectX SDK(以目前最新的Microsoft DirectX SDK (June 2010)为例)的Windows DirectX Graphics.chm文档中依次展开【Windows DirectX Graphics Documentation】->【Direct3D 9 Graphics】->【Reference for Direct3D 9】->【D3DX Reference】->【D3DX Functions】->【Shape Drawing Functions】找到这些函数的说明文档,这是这些函数最官方最原始的参考地址了。

    不过显然这些DirectX SDK Document都是纯英文的,和大众之间的距离还是比较疏远。

     

    先给大家看看这几个函数的全家福,后面我们会全部详细介绍使用方法的:

     

    D3DXCreateBox   用于创建一个盒子,立方体

    D3DXCreateSphere   用于创建一个球面体

     

    D3DXCreateCylinder 用于创建一个柱体

    D3DXCreateTeapot 用于创建一个茶壶

    D3DXCreatePolygon 用于创建一个多边形

    D3DXCreateTorus        用于创建一个圆环体

     

     

    我们可以看到这些函数的名字取的都非常的憨厚老实,一开始是D3DX,然后紧跟其后一个Create,表示是在创建某东西,最后跟上对应的几何体名,比如Teapot茶壶,这样连起来就非常好记忆了,D3DXCreateTeapot。

     

     

     

    二、D3D中几种内置的几何体绘制四步曲

     

     

    首先需要说明的是下面提到的ID3DXMesh接口类型是后面我们在讲解网格相关知识的时候重点讲解的内容,这里大家先对其有一个大概的印象就可以了。

     

    想要通过这几个函数快捷绘制出一个几何体,需要以下几步:

     

    1.定义一个ID3DXMesh接口类型的对象。

     

    2.调用这六个函数的其中一个对我们在第一步里面定义的这个对象进行初始化,也就是把创建好的网格存储在我们定义好的ID3DXMesh类型的对象中

     

    3.在Direct3D渲染五步曲的第三步,也就是在BeginScene之后调用DrawSubset方法进行网格图形的绘制,即是拿着第二步里面初始化好的ID3DXMesh接口类型的对象指一下DrawSubset(0)方法就好了

     

    4.绘制完成之后,调用ID3DMesh接口的Release方法,或者我们自定义的COM接口释放宏进行资源的释放。

     

     

    总结起来也就简明扼要八个字:

     

    定义,创建,绘制,释放

     

     

    方便大家理解各个过程,给出一个配套的注释好的代码:

    //四步曲之一,定义
    ID3DXMesh* meshBox;
    //四步曲之二,创建
    D3DXCreateBox(  g_pd3dDevice,  2.0f, 2.0f,   2.0f,&meshBox, 0  );
    //四步曲之三,绘制
    g_pd3dDevice->BeginScene();
    meshBox->DrawSubset(0);
    //四步曲之四,释放
    meshBox->Release();
    


     

     

     

    三、D3D中几种内置几何体的创建详细剖析

     

     

    这一小节里面讲解的都是上文我们提到的几何体绘制四步曲的第二步里面的具体创建方法,但是配套的调用实例都包含了四步曲里面的前三步,大家需要注意下。

     

     

    1. 立方体的创建——D3DXCreateBox方法

     

    D3DXCreateBox方法用于创建一个立方体,或者说是一个盒子。

    HRESULT  D3DXCreateBox(
      __in   LPDIRECT3DDEVICE9 pDevice,//Direct3D设备对象
      __in   FLOAT Width, //盒子的宽度
      __in   FLOAT Height,//盒子的高度
      __in   FLOAT Depth,//盒子的深度
      __out  LPD3DXMESH *ppMesh,//存储着盒子网格的指针
      __out  LPD3DXBUFFER *ppAdjacency//存储三角形索引的指针
    );
    

    █ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个盒子网格之间关联起来了。

    █第二个参数,FLOAT类型的Width,表示我们创建的盒子沿着X轴的宽度。

    █第三个参数,FLOAT类型的Height,表示我们创建的盒子沿着Y轴的高度。

    █第四个参数 , FLOAT类型的Depth,表示我们创建的盒子沿着Z轴的深度。

    █第五个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateBox函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的盒子网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_box->DrawSubset(0);

    █第六个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

     

     

    下面是一个调用实例,创建一个长方体:

     

    //用此函数产生一个长方体
             ID3DXMesh* meshBox;
             D3DXCreateBox(  
                                g_pd3dDevice, //D3D绘制对象
                                2.0f, //宽度
                                2.0f, //高度
                                2.0f, //深度
                                &meshBox,//对应COM对象
                                0 //指向ID3DXBuffer,存放相邻平面的信息,通常设置成0(或NULL)
                                );
             g_pd3dDevice->BeginScene();
             meshBox->DrawSubset(0);
    


     

     

     

    2. 柱体的创建——D3DXCreateCylinder方法

     

    D3DXCreateCylinder方法用于创建柱体。

    HRESULT  D3DXCreateCylinder(
      __in   LPDIRECT3DDEVICE9 pDevice,
      __in   FLOAT Radius1,
      __in   FLOAT Radius2,
      __in   FLOAT Length,
      __in   UINT Slices,
      __in   UINT Stacks,
      __out  LPD3DXMESH *ppMesh,
      __out  LPD3DXBUFFER *ppAdjacency
    );
    

     

    █ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个柱体网格之间关联起来了。

    █ 第二个参数,FLOAT类型的Radius1,表示我们创建的柱体沿Z轴负方向的半径大小,这个参数显然必须大于等于0.0f。

    █ 第三个参数,FLOAT Radius2, 表示我们创建的柱体沿Z轴正方向的半径大小,这个参数显然必须大于等于0.0f。

     

    █ 第四个参数,FLOAT类型的Length,表示我们创建的柱体沿Z轴的长度。

    █ 第五个参数,UINT类型的Slices,表示柱体的外围有几个面,举个例子,如果设为8的话,我们创建的就是八角柱了。

    █ 第六个参数,UINT类型的Stacks,表示柱体的两端间共有几段,这个后面光照效果的时候需要要用到的。

    █ 第七个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateCylinder函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的柱体网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_Cylinder->DrawSubset(0);

     █ 第八个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

     

     

     

    3. 2D 多边形的创建——D3DXCreatePolygon方法

    D3DXCreatePolygon方法用于快速创建一个2D多边形。

     

    HRESULT  D3DXCreatePolygon(
      __in   LPDIRECT3DDEVICE9 pDevice,
      __in   FLOAT Length,
      __in   UINT Sides,
      __out  LPD3DXMESH *ppMesh,
      __out  LPD3DXBUFFER *ppAdjacency
    );

    █ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个2D 多边形网格之间关联起来了。

    █ 第二个参数,UINT类型的Sides,表示我们创建的多边形每条边的长度。

    █ 第三个参数,FLOAT Radius2, 表示我们创建的多边形的包含几个三角形。

    █ 第四个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateCylinder函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的2D多边形网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_Polygon->DrawSubset(0);

     

    █ 第五个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

     

    下面是一个调用实例

     

    //用此函数产生一个2D 多边体
             ID3DXMesh* meshPolygon;
             D3DXCreatePolygon( 
                                g_pd3dDevice, //D3D绘制对象
                                2.0f,  //每条边的长度
                                6, //包含几个三角形
                                &meshPolygon,
                                0 //通常设置成0(或NULL)
                                );
             g_pd3dDevice->BeginScene();
             meshPolygon->DrawSubset(0);

     


     

    4. 球面体创建——D3DXCreateSphere方法

    D3DXCreateSphere方法用于创建一个球面体。

     

    HRESULT  D3DXCreateSphere(
      __in   LPDIRECT3DDEVICE9 pDevice,
      __in   FLOAT Radius,
      __in   UINT Slices,
      __in   UINT Stacks,
      __out  LPD3DXMESH *ppMesh,
      __out  LPD3DXBUFFER *ppAdjacency
    );

     

    █ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个2D 多边形网格之间关联起来了。(浅墨在这里是复制粘贴上面的介绍,因为这个参数在本篇文章里介绍的几个创建几何体函数中都是一样的)

    █ 第二个参数,UINT类型的Sides,表示我们创建的多边形每条边的长度。

    █ 第三个参数,UINT类型的Slices, 表示我们创建的球面体绕主轴线切片数,也就是用几条经线来进行绘制。

    █ 第四个参数,UINT类型的Stacks,表示我们创建的球面体绕主轴线的纬线数,也就是用几条纬线来进行绘制。

    █ 第五个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateCylinder函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的球面体网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_Polygon->DrawSubset(0);

    █ 第六个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

     

     

    依然是一个调用实例:

             

    //用此函数产生一个球面体
             ID3DXMesh* meshSphere; 
             D3DXCreateSphere(  
                            g_pd3dDevice, //D3D绘制对象
                                1.0f, //球面体半径
                                10, //用几条经线绘制
                                10, //用几条维线绘制
                                &meshSphere,
                             0 //通常设置成0(或NULL)
                                );
             g_pd3dDevice->BeginScene();
             meshSphere->DrawSubset(0);

     

    看到这里如果大家觉得累了,来看几幅游戏美图吧,今天浅墨给大家准备的是2012年8月份刚上市的游戏大作《暗黑血统2》的桌面壁纸,这款游戏浅墨最近在玩,感觉还不错:

    是不是很酷呢?上面的第二张图片浅墨可是做了很长时间的壁纸的呢。

    好了,下面我们继续来讲解。


     

    五 茶壶的创建——D3DXCreateTeapot方法

      

    D3DXCreateTeapot方法用于创建一个茶壶。

    HRESULT  D3DXCreateTeapot(
      __in   LPDIRECT3DDEVICE9 pDevice,
      __out  LPD3DXMESH *ppMesh,
      __out  LPD3DXBUFFER *ppAdjacency
    );

    这个函数相对来说参数很少,他并没有给我们提供茶壶具体参数的设置。

    █ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个2D 多边形网格之间关联起来了。(浅墨在这里是复制粘贴上面的介绍,因为这个参数在本篇文章里介绍的几个创建几何体函数中都是一样的)

    █ 第二个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateCylinder函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的茶壶网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_Polygon->DrawSubset(0);

    █ 第三个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

     

    依然是一个调用实例:

     //用此函数产生一个茶壶
             ID3DXMesh* meshTeapot;
             D3DXCreateTeapot(
                                g_pd3dDevice, //D3D绘制对象
                                &meshTeapot,
                                0 //通常设置成0(或NULL)
                                );
             g_pd3dDevice->BeginScene();
             meshTeapot->DrawSubset(0);


           

    六、圆环的创建——D3DXCreateTorus方法

     

    D3DXCreateTorus方法用于创建一个圆环体。

     

    HRESULT  D3DXCreateTorus(
      __in   LPDIRECT3DDEVICE9 pDevice,
      __in   FLOAT InnerRadius,
      __in   FLOAT OuterRadius,
      __in   UINT Sides,
      __in   UINT Rings,
      __out  LPD3DXMESH *ppMesh,
      __out  LPD3DXBUFFER *ppAdjacency
    );

    █ 第一个参数,LPDIRECT3DDEVICE9类型的pDevice,指向IDirect3DDevice9接口的指针,这样一般就填我们在初始化四步曲里面创建的有效的Direct3D绘制”金钥匙”——Direct3D设备对象g_pd3dDevice。表示Direct3D设备对象和我们创建的这个2D 多边形网格之间关联起来了。(浅墨在这里是复制粘贴上面的介绍,因为这个参数在本篇文章里介绍的几个创建几何体函数中都是一样的)

    █ 第二个参数,FLOAT类型的InnerRadius,表示我们创建的圆环的內圈半径。

    █ 第三个参数,FLOAT类型的OuterRadius, 表示我们创建的圆环的外圈半径。

    █ 第四个参数,UINT类型的Sides,表示我们创建的圆环的外圈有几个面,也就是大圆的轮廓是几边形,这个值显然要大于等于3.

    █ 第五个参数,UINT类型的Rings,表示我们创建的圆环的内圈与外圈之间有几个面。

    █ 第六个参数,LPD3DXMESH类型的*ppMesh,一个存储着我们创建的形状的指针的地址,也就是绘制用D3DXCreateCylinder函数创建的网格的金钥匙,后面需要绘制我们用这个函数创建的圆环体网格的话,拿这个指针指一下DrawSubset方法,也就是这样写g_Polygon->DrawSubset(0);

     █ 第七个参数,LPD3DXBUFFER类型的*ppAdjacency,它存储着我们在这里绘制的网格的三角形索引的指针,我们不用他的话,设为0就可以了。

     

     

    依然是一个调用实例:

    //用此函数产生一个圆环体
             ID3DXMesh* meshTours; 
             D3DXCreateTorus(  
                             g_pd3dDevice, //D3D绘制对象
                                1.0f, //圆环的內圈半径
                                3.0f, //圆环的外圈半径
                                10, //外圈有几个面
                                10, //內圈和外圈间有几个面(同心圆)
                             &meshTours,
                             0 //通常设置成0(或NULL)
                              );
             g_pd3dDevice->BeginScene();
             meshTours->DrawSubset(0);


     

     

    讲解最后做下总结,首先,我们可以发现这些方法的第一个参数和最后两个参数都是相同的。然后,这些函数的使用方法不用去强行记忆,用到的时候按D3DX+Create+几何体名字的命名方法去查一下SDK文档或者稍微看一下这篇博文就可以了。

     

     

     

     

    四,详细注释的源代码讲解及欣赏

     

    这里依旧是通过一个小程序,来把本篇文章所学的知识融会贯通。本篇文章里面我们介绍了Direct3D中立方体(Cube),圆环体(Torus),多边形(Polygon),球面体(Sphere),茶壶(Teapot)和圆柱体(Cylinder)这几种几何体的简洁绘制法,而下面就是一个通过本篇文章里介绍的方法绘制出四个几何体的程序的源代码。在贴出详细注释的源代码之前,我们先讲解一下写这个演示程序中的几个要点。

     

    首先,我们定义了几个全局的ID3DXMesh对象,以及几个D3DXMATRIX矩阵类型。这里定义ID3DXMesh对象就是我们本节介绍的几何体绘制四步曲的第一步,而矩阵类型是为了后面给绘制的每个几何体不同的世界坐标位置以及做出旋转的镜头效果。相关代码如下:

    LPD3DXMESH g_teapot = NULL;         //茶壶对象
    LPD3DXMESH g_cube = NULL;            //立方体(盒子)对象
    LPD3DXMESH g_sphere = NULL;         //球面体对象
    LPD3DXMESH g_torus = NULL;           //圆环对象
    D3DXMATRIX g_WorldMatrix[4],R;        //定义一些全局的世界矩阵


     

    然后,我们在Objects_Init()方法中进行了几何体绘制四步曲的第二步,创建几何体的过程(我们准备绘制立方体,茶壶,球面体,茶壶这四个几何体,就在这一步当中进行了创建),以及调用了一些SetRenderState关闭了光照,开启了背面消隐,以及将填充模式默认设置为线框填充。因为Objects_Init()方法我们整个程序运行过程中只会运行一次,所以默认的渲染模式的设置都可以在这里进行。相关代码如下:

    HRESULT Objects_Init()
    {
    	//创建字体
    	if(FAILED(D3DXCreateFont(g_pd3dDevice, 30, 0, 0, 1, FALSE, DEFAULT_CHARSET, 
    		OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("宋体"), &g_pFont)))
    		return E_FAIL;
    
    
    	// 物体的创建
    	if(FAILED(D3DXCreateBox(g_pd3dDevice, 2, 2, 2, &g_cube, NULL)))	//立方体的创建
    		return false;
    	if(FAILED(D3DXCreateTeapot(g_pd3dDevice, &g_teapot, NULL)))		//茶壶的创建
    		return false;	
    	if(FAILED(D3DXCreateSphere(g_pd3dDevice, 1.5, 25, 25,					//球面体的创建
    		&g_sphere, NULL))) return false;
    	if(FAILED(D3DXCreateTorus(g_pd3dDevice, 0.5f, 1.2f, 25, 25,				//圆环体的创建
    		&g_torus, NULL))) return false;
    	// 设置渲染状态
    	g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);   //关闭光照
    	g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);   //开启背面消隐
    	g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);  //设置线框填充模式
    
    	return S_OK;
    }


     

     

    接着,就是在Direct3D_Render()函数中进行绘制了,需要注意的是,四大矩阵变换我们原先都是封装在Matrix_Set()方法中进行的,而这里我们为了绘制的方便,我们把世界变换从Matrix_Set()方法中拿出来,放到了Direct3D_Render()之中。另外需要注意的一点是,制作出镜头旋转的方法,我们先用D3DXMatrixRotationY方法制作一个根据系统时间绕Y轴旋转的矩阵R出来,就是这样写:

    D3DXMatrixRotationY(&R, ::timeGetTime() / 720.0f);


      然后在设置好物体的世界矩阵坐标后,右乘一下我们制作好的矩阵R,然后把结果矩阵设置为当前的世界矩阵,再进行绘制就可以了。

    // 进行立方体的绘制
             D3DXMatrixTranslation(&g_WorldMatrix[0], 3.0f, -3.0f, 0.0f);
             g_WorldMatrix[0]  =  g_WorldMatrix[0]*R; 
             g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[0]);
             g_cube->DrawSubset(0);

    关于这一步的完整代码由于比较长,就在讲解中不贴出来了,因为下面全部代码之中有的,其实就是Direct3D_Render()的函数的实现方法。

     

    最后,绘制完成之后,在程序准备退出的时候就是几何体绘制四步曲的第四步——释放了。其实就是Direct3D_CleanUp()函数的实现代码:

    //*****************************************************************************************
    // Name: Direct3D_CleanUp()
    // Desc: 对Direct3D的资源进行清理,释放COM接口对象
    //*****************************************************************************************
    void Direct3D_CleanUp()
    {
    	//释放COM接口对象	
    	SAFE_RELEASE(g_torus)
    	SAFE_RELEASE(g_sphere)
    	SAFE_RELEASE(g_cube)
    	SAFE_RELEASE(g_teapot)
    	SAFE_RELEASE(g_pFont)
    	SAFE_RELEASE(g_pd3dDevice)	
    }


     

     

     

    好了,讲解完成,最后我们贴出详细注释的源代码:

     

    //*****************************************************************************************
    //
    //【Visual C++】游戏开发笔记系列配套源码 三十九 浅墨DirectX教程之七 他山之石: 几种几何体的简洁绘制法
    //		 VS2010版
    // 2013年 1月6日  Create by 浅墨 
    //图标素材取自: 游戏大作 《波斯王子:时之沙》
    //此刻心情:如果你看到了前面的黑暗,不要担心,那是因为你的背后有阳光。
    
    
    //程序运行说明: 按键盘上数字键“1”键和“2”键可以在线框填充模式和实体填充模式之间切换。默认情况下是线框填充
    //***************************************************************************************** 
    
    
    
    
    //*****************************************************************************************
    // Desc: 头文件定义部分  
    //*****************************************************************************************                                                                                       
    #include <d3d9.h>
    #include <d3dx9.h>
    #include <tchar.h>
    #include   <time.h> 
    
    
    
    
    //*****************************************************************************************
    // Desc: 库文件定义部分  
    //***************************************************************************************** 
    #pragma comment(lib,"d3d9.lib")
    #pragma comment(lib,"d3dx9.lib")
    #pragma comment(lib, "winmm.lib ")
    
    
    //*****************************************************************************************
    // Desc: 宏定义部分   
    //*****************************************************************************************
    #define SCREEN_WIDTH	800						//为窗口宽度定义的宏,以方便在此处修改窗口宽度
    #define SCREEN_HEIGHT	600							//为窗口高度定义的宏,以方便在此处修改窗口高度
    #define WINDOW_TITLE	_T("【Visual C++游戏开发笔记】博文配套demo之三十九 浅墨DirectX教程之七 他山之石: 几种几何体的简洁绘制法") //为窗口标题定义的宏
    #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }      //自定义一个SAFE_RELEASE()宏,便于资源的释放
    
    
    
    //*****************************************************************************************
    // Desc: 全局变量声明部分  
    //*****************************************************************************************
    LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; //Direct3D设备对象
    ID3DXFont*				g_pFont=NULL;    //字体COM接口
    float					g_FPS = 0.0f;       //一个浮点型的变量,代表帧速率
    wchar_t					g_strFPS[50];    //包含帧速率的字符数组
    LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL;    //顶点缓存对象
    LPDIRECT3DINDEXBUFFER9  g_pIndexBuffer  = NULL;    // 索引缓存对象
    LPD3DXMESH g_teapot = NULL;		//茶壶对象
    LPD3DXMESH g_cube = NULL;		//立方体(盒子)对象
    LPD3DXMESH g_sphere = NULL;		//球面体对象
    LPD3DXMESH g_torus = NULL;		//圆环对象
    D3DXMATRIX g_WorldMatrix[4],R;        //定义一些全局的世界矩阵
    
    //*****************************************************************************************
    // Desc: 全局函数声明部分 
    //***************************************************************************************** 
    LRESULT CALLBACK	WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
    HRESULT				Direct3D_Init(HWND hwnd);
    HRESULT				Objects_Init();
    void				Direct3D_Render( HWND hwnd);
    void				Direct3D_CleanUp( );
    float				Get_FPS();
    VOID				Matrix_Set();
    
    
    //*****************************************************************************************
    // Name: WinMain( )
    // Desc: Windows应用程序入口函数
    //*****************************************************************************************
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
    {
    
    	//开始设计一个完整的窗口类
    	WNDCLASSEX wndClass = { 0 };				//用WINDCLASSEX定义了一个窗口类,即用wndClass实例化了WINDCLASSEX,用于之后窗口的各项初始化    
    	wndClass.cbSize = sizeof( WNDCLASSEX ) ;	//设置结构体的字节数大小
    	wndClass.style = CS_HREDRAW | CS_VREDRAW;	//设置窗口的样式
    	wndClass.lpfnWndProc = WndProc;				//设置指向窗口过程函数的指针
    	wndClass.cbClsExtra		= 0;
    	wndClass.cbWndExtra		= 0;
    	wndClass.hInstance = hInstance;				//指定包含窗口过程的程序的实例句柄。
    	wndClass.hIcon=(HICON)::LoadImage(NULL,_T("icon.ico"),IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //从全局的::LoadImage函数从本地加载自定义ico图标
    	wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );    //指定窗口类的光标句柄。
    	wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);  //为hbrBackground成员指定一个灰色画刷句柄
    	wndClass.lpszMenuName = NULL;						//用一个以空终止的字符串,指定菜单资源的名字。
    	wndClass.lpszClassName = _T("ForTheDreamOfGameDevelop");		//用一个以空终止的字符串,指定窗口类的名字。
    
    	if( !RegisterClassEx( &wndClass ) )				//设计完窗口后,需要对窗口类进行注册,这样才能创建该类型的窗口
    		return -1;		
    
    	HWND hwnd = CreateWindow( _T("ForTheDreamOfGameDevelop"),WINDOW_TITLE,			//喜闻乐见的创建窗口函数CreateWindow
    		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, SCREEN_WIDTH,
    		SCREEN_HEIGHT, NULL, NULL, hInstance, NULL );
    
    
    	//Direct3D资源的初始化,调用失败用messagebox予以显示
    	if (!(S_OK==Direct3D_Init (hwnd)))
    	{
    		MessageBox(hwnd, _T("Direct3D初始化失败~!"), _T("浅墨的消息窗口"), 0); //使用MessageBox函数,创建一个消息窗口 
    	}
    
    
    
    	MoveWindow(hwnd,200,50,SCREEN_WIDTH,SCREEN_HEIGHT,true);   //调整窗口显示时的位置,窗口左上角位于屏幕坐标(200,50)处
    	ShowWindow( hwnd, nShowCmd );    //调用Win32函数ShowWindow来显示窗口
    	UpdateWindow(hwnd);  //对窗口进行更新,就像我们买了新房子要装修一样
    
    	
    
    	
    
    	//消息循环过程
    	MSG msg = { 0 };  //初始化msg
    	while( msg.message != WM_QUIT )			//使用while循环
    	{
    		if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )   //查看应用程序消息队列,有消息时将队列中的消息派发出去。
    		{
    			TranslateMessage( &msg );		//将虚拟键消息转换为字符消息
    			DispatchMessage( &msg );		//该函数分发一个消息给窗口程序。
    		}
    		else
    		{
    			Direct3D_Render(hwnd);			//调用渲染函数,进行画面的渲染
    		}
    	}
    
    	UnregisterClass(_T("ForTheDreamOfGameDevelop"), wndClass.hInstance);
    	return 0;  
    }
    
    
    
    //*****************************************************************************************
    // Name: WndProc()
    // Desc: 对窗口消息进行处理
    //*****************************************************************************************
    LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )   //窗口过程函数WndProc
    {
    	switch( message )				//switch语句开始
    	{
    	case WM_PAINT:					 // 客户区重绘消息
    		Direct3D_Render(hwnd);          //调用Direct3D_Render函数,进行画面的绘制
    		ValidateRect(hwnd, NULL);   // 更新客户区的显示
    		break;									//跳出该switch语句
    
    	case WM_KEYDOWN:                // 键盘按下消息
    		if (wParam == VK_ESCAPE)    // ESC键
    			DestroyWindow(hwnd);    // 销毁窗口, 并发送一条WM_DESTROY消息
    		break;
    	case WM_DESTROY:				//窗口销毁消息
    		Direct3D_CleanUp();     //调用Direct3D_CleanUp函数,清理COM接口对象
    		PostQuitMessage( 0 );		//向系统表明有个线程有终止请求。用来响应WM_DESTROY消息
    		break;						//跳出该switch语句
    
    	default:						//若上述case条件都不符合,则执行该default语句
    		return DefWindowProc( hwnd, message, wParam, lParam );		//调用缺省的窗口过程来为应用程序没有处理的窗口消息提供缺省的处理。
    	}
    
    	return 0;					//正常退出
    }
    
    
    //*****************************************************************************************
    // Name: Direct3D_Init( )
    // Desc: 初始化Direct3D
    // Point:【Direct3D初始化四步曲】
    //		1.初始化四步曲之一,创建Direct3D接口对象
    //		2.初始化四步曲之二,获取硬件设备信息
    //		3.初始化四步曲之三,填充结构体
    //		4.初始化四步曲之四,创建Direct3D设备接口
    //*****************************************************************************************
    
    HRESULT Direct3D_Init(HWND hwnd)
    {
    
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D初始化四步曲之一,创接口】:创建Direct3D接口对象, 以便用该Direct3D对象创建Direct3D设备对象
    	//--------------------------------------------------------------------------------------
    	LPDIRECT3D9  pD3D = NULL; //Direct3D接口对象的创建
    	if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //初始化Direct3D接口对象,并进行DirectX版本协商
     			return E_FAIL;
    
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D初始化四步曲之二,取信息】:获取硬件设备信息
    	//--------------------------------------------------------------------------------------
    	D3DCAPS9 caps; int vp = 0;
    	if( FAILED( pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps ) ) )
    		{
    			return E_FAIL;
    		}
    	if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
    		vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;   //支持硬件顶点运算,我们就采用硬件顶点运算,妥妥的
    	else
    		vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //不支持硬件顶点运算,无奈只好采用软件顶点运算
    
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D初始化四步曲之三,填内容】:填充D3DPRESENT_PARAMETERS结构体
    	//--------------------------------------------------------------------------------------
    	D3DPRESENT_PARAMETERS d3dpp; 
    	ZeroMemory(&d3dpp, sizeof(d3dpp));
    	d3dpp.BackBufferWidth            = SCREEN_WIDTH;
    	d3dpp.BackBufferHeight           = SCREEN_HEIGHT;
    	d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
    	d3dpp.BackBufferCount            = 1;
    	d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
    	d3dpp.MultiSampleQuality         = 0;
    	d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD; 
    	d3dpp.hDeviceWindow              = hwnd;
    	d3dpp.Windowed                   = true;
    	d3dpp.EnableAutoDepthStencil     = true; 
    	d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
    	d3dpp.Flags                      = 0;
    	d3dpp.FullScreen_RefreshRateInHz = 0;
    	d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;
    
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D初始化四步曲之四,创设备】:创建Direct3D设备接口
    	//--------------------------------------------------------------------------------------
    	if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 
    		hwnd, vp, &d3dpp, &g_pd3dDevice)))
    		return E_FAIL;
    
    
    	if(!(S_OK==Objects_Init())) return E_FAIL;
    
    
    
    	SAFE_RELEASE(pD3D) //LPDIRECT3D9接口对象的使命完成,我们将其释放掉
    
    	return S_OK;
    }
    
    
    HRESULT Objects_Init()
    {
    	//创建字体
    	if(FAILED(D3DXCreateFont(g_pd3dDevice, 30, 0, 0, 1, FALSE, DEFAULT_CHARSET, 
    		OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, _T("宋体"), &g_pFont)))
    		return E_FAIL;
    
    
    	// 物体的创建
    	if(FAILED(D3DXCreateBox(g_pd3dDevice, 2, 2, 2, &g_cube, NULL)))	//立方体的创建
    		return false;
    	if(FAILED(D3DXCreateTeapot(g_pd3dDevice, &g_teapot, NULL)))		//茶壶的创建
    		return false;	
    	if(FAILED(D3DXCreateSphere(g_pd3dDevice, 1.5, 25, 25,					//球面体的创建
    		&g_sphere, NULL))) return false;
    	if(FAILED(D3DXCreateTorus(g_pd3dDevice, 0.5f, 1.2f, 25, 25,				//圆环体的创建
    		&g_torus, NULL))) return false;
    	// 设置渲染状态
    	g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);   //关闭光照
    	g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);   //开启背面消隐
    	g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);  //设置线框填充模式
    
    	return S_OK;
    }
    
    
    //*****************************************************************************************
    // Name:Matrix_Set()
    // Desc: 设置世界矩阵
    // Point:【Direct3D四大变换】
    //		1.【四大变换之一】:世界变换矩阵的设置
    //		2.【四大变换之二】:取景变换矩阵的设置
    //		3.【四大变换之三】:投影变换矩阵的设置
    //		4.【四大变换之四】:视口变换的设置
    //*****************************************************************************************
    VOID Matrix_Set()
    {
    	//--------------------------------------------------------------------------------------
    	//【四大变换之一】:世界变换矩阵的设置
    	//--------------------------------------------------------------------------------------
    
    
    	//--------------------------------------------------------------------------------------
    	//【四大变换之二】:取景变换矩阵的设置
    	//--------------------------------------------------------------------------------------
    	D3DXMATRIX matView; //定义一个矩阵
    	D3DXVECTOR3 vEye(0.0f, 0.0f, -15.0f);  //摄像机的位置
    	D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f); //观察点的位置
    	D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);//向上的向量
    	D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); //计算出取景变换矩阵
    	g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); //应用取景变换矩阵
    
    	//--------------------------------------------------------------------------------------
    	//【四大变换之三】:投影变换矩阵的设置
    	//--------------------------------------------------------------------------------------
    	D3DXMATRIX matProj; //定义一个矩阵
    	D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, 1.0f, 1.0f, 1000.0f); //计算投影变换矩阵
    	g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);  //设置投影变换矩阵
    
    	//--------------------------------------------------------------------------------------
    	//【四大变换之四】:视口变换的设置
    	//--------------------------------------------------------------------------------------
    	D3DVIEWPORT9 vp; //实例化一个D3DVIEWPORT9结构体,然后做填空题给各个参数赋值就可以了
    	vp.X      = 0;		//表示视口相对于窗口的X坐标
    	vp.Y      = 0;		//视口相对对窗口的Y坐标
    	vp.Width  = SCREEN_WIDTH;	//视口的宽度
    	vp.Height = SCREEN_HEIGHT; //视口的高度
    	vp.MinZ   = 0.0f; //视口在深度缓存中的最小深度值
    	vp.MaxZ   = 1.0f;	//视口在深度缓存中的最大深度值
    	g_pd3dDevice->SetViewport(&vp); //视口的设置
    
    }
    
    
    
    //*****************************************************************************************
    // Name: Direct3D_Render()
    // Desc: 进行图形的渲染操作
    // Point:【Direct3D渲染五步曲】
    //		1.渲染五步曲之一,清屏操作
    //		2.渲染五步曲之二,开始绘制
    //		3.渲染五步曲之三,正式绘制
    //		4.渲染五步曲之四,结束绘制
    //		5.渲染五步曲之五,翻转显示
    //*****************************************************************************************
    
    void Direct3D_Render(HWND hwnd)
    {
    
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D渲染五步曲之一】:清屏操作
    	//--------------------------------------------------------------------------------------
    	g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    
    	//定义一个矩形,用于获取主窗口矩形
    	RECT formatRect;
    	GetClientRect(hwnd, &formatRect);
    
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D渲染五步曲之二】:开始绘制
    	//--------------------------------------------------------------------------------------
    	g_pd3dDevice->BeginScene();                     // 开始绘制
    
    	Matrix_Set();
    
    	// 获取键盘消息并给予设置相应的填充模式
    	if (::GetAsyncKeyState(0x31) & 0x8000f)         // 若数字键1被按下,进行线框填充
    		g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
    	if (::GetAsyncKeyState(0x32) & 0x8000f)         // 若数字键2被按下,进行实体填充
    		g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
    
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D渲染五步曲之三】:正式绘制,利用顶点缓存绘制图形
    	//--------------------------------------------------------------------------------------
    
    	//--------------------------------------------------------------------------------------
    	// 【顶点缓存、索引缓存绘图四步曲之四】:绘制图形
    	//--------------------------------------------------------------------------------------
    
    
    	  D3DXMatrixRotationY(&R, ::timeGetTime() / 720.0f);
    
    
    	// 进行立方体的绘制
    	D3DXMatrixTranslation(&g_WorldMatrix[0], 3.0f, -3.0f, 0.0f);
    	g_WorldMatrix[0]  =  g_WorldMatrix[0]*R; 
    	g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[0]);
    	g_cube->DrawSubset(0);
    
    	//进行茶壶的绘制
    	D3DXMatrixTranslation(&g_WorldMatrix[1], -3.0f, -3.0f, 0.0f);
    	g_WorldMatrix[1]  =  g_WorldMatrix[1]*R; 
    	g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[1]);	
    	g_teapot->DrawSubset(0);
    
    	// 进行圆环的绘制
    	D3DXMatrixTranslation(&g_WorldMatrix[2], 3.0f, 3.0f, 0.0f);
    	g_WorldMatrix[2]  =  g_WorldMatrix[2]*R; 
    	g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[2]);	
    	g_torus->DrawSubset(0);
    
    	// 进行球面体的绘制
    	D3DXMatrixTranslation(&g_WorldMatrix[3], -3.0f, 3.0f, 0.0f);
    	g_WorldMatrix[3]  =  g_WorldMatrix[3]*R; 
    	g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_WorldMatrix[3]);
    	g_sphere->DrawSubset(0);
    
    	//在窗口右上角处,显示每秒帧数
    	int charCount = swprintf_s(g_strFPS, 20, _T("FPS:%0.3f"), Get_FPS() );
    	g_pFont->DrawText(NULL, g_strFPS, charCount , &formatRect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255,239,136));
    
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D渲染五步曲之四】:结束绘制
    	//--------------------------------------------------------------------------------------
    	g_pd3dDevice->EndScene();                       // 结束绘制
    	//--------------------------------------------------------------------------------------
    	// 【Direct3D渲染五步曲之五】:显示翻转
    	//--------------------------------------------------------------------------------------
    	g_pd3dDevice->Present(NULL, NULL, NULL, NULL);  // 翻转与显示
    	 
    }
    
    
    //*****************************************************************************************
    // Name:Get_FPS()函数
    // Desc: 用于计算帧速率
    //*****************************************************************************************
    float Get_FPS()
    {
    
    	//定义四个静态变量
    	static float  fps = 0; //我们需要计算的FPS值
    	static int    frameCount = 0;//帧数
    	static float  currentTime =0.0f;//当前时间
    	static float  lastTime = 0.0f;//持续时间
    
    	frameCount++;//每调用一次Get_FPS()函数,帧数自增1
    	currentTime = timeGetTime()*0.001f;//获取系统时间,其中timeGetTime函数返回的是以毫秒为单位的系统时间,所以需要乘以0.001,得到单位为秒的时间
    
    	//如果当前时间减去持续时间大于了1秒钟,就进行一次FPS的计算和持续时间的更新,并将帧数值清零
    	if(currentTime - lastTime > 1.0f) //将时间控制在1秒钟
    	{
    		fps = (float)frameCount /(currentTime - lastTime);//计算这1秒钟的FPS值
    		lastTime = currentTime; //将当前时间currentTime赋给持续时间lastTime,作为下一秒的基准时间
    		frameCount    = 0;//将本次帧数frameCount值清零
    	}
    
    	return fps;
    }
    
    
    //*****************************************************************************************
    // Name: Direct3D_CleanUp()
    // Desc: 对Direct3D的资源进行清理,释放COM接口对象
    //*****************************************************************************************
    void Direct3D_CleanUp()
    {
    	//释放COM接口对象	
    	SAFE_RELEASE(g_torus)
    	SAFE_RELEASE(g_sphere)
    	SAFE_RELEASE(g_cube)
    	SAFE_RELEASE(g_teapot)
    	SAFE_RELEASE(g_pFont)
    	SAFE_RELEASE(g_pd3dDevice)	
    }
    


     

     

     

    编译并运行上面的源代码,我们就可以得到如下四个排列规则的几何体,且这些几何体都在不停地绕着Y轴不停地旋转着,按按键盘上数字键“1”键和“2”键可以在线框填充模式和实体填充模式之间切换:

     

     

     

    按下数字键“2”,我们可以看到这些几何体的实体填充模式:

     

     

    因为我们关闭了光照,而且材质也没给我们的几何体设置,所以在实体填充模式下这些几何体白得有些惨不忍睹,立体感全无,没关系,敬请期待浅墨下篇讲解光照和材质的文章。

     

    文章最后,依旧是放出本篇文章配套源代码的下载:

     

    本节笔记配套源代码请点击这里下载:

     

     

    【浅墨DirectX提高班】配套源代码之七下载 

     其中图标素材取自的游戏大作 波斯王子:时之沙 

    以上就是本节笔记的全部内容,更多精彩内容,且听下回分解。

     

    浅墨在这里,希望喜欢游戏开发系列文章的朋友们能留下你们的评论,每次浅墨登陆博客看到大家的留言的时候都会非常开心,感觉自己正在传递一种信仰,一种精神。

     

     文章最后,依然是【每文一语】栏目,今天是来自张爱玲的句子: 

     

    在这个光怪陆离的人间,没有谁可以将日子过得行云流水。但我始终相信,走过平湖烟雨,岁月山河,那些历尽劫数、尝遍百味的人,会更加生动而干净。时间永远是旁观者,所有的过程和结果,都需要我们自己承担。

     

    下周一,让我们离游戏开发的梦想更近一步。

    下周一,游戏开发笔记,我们,不见不散。

     

    展开全文
  • 节课产品经理P1 学习总结

    千次阅读 2019-09-05 00:10:21
    完成节课产品经理P1课程,以全优成绩毕业。课程目标用户,是未入行及2年内的初级产品经理,目的是打牢基本功,培养基本产品感。方式是每周线上课程(录像)+作业,助教会对每次作业进行点评,鼓励迭代修改。 课程...

    完成三节课产品经理P1课程,以全优成绩毕业。课程目标用户,是未入行及2年内的初级产品经理,目的是打牢基本功,培养基本产品感。方式是每周线上课程(录像)+作业,助教会对每次作业进行点评,鼓励迭代修改。

    课程共六周,分别为:

    • 产品视角

    • 用户需求

    • 功能&流程

    • 原型

    • 功能点&产品调研

    • 需求文档

    对于自身,课程的最大帮助在于实践。因为教材干货,网上资料很多,但容易只看不练。看了很多、很深入,但等到要输出时照样两眼放白。通过课程交作业方式,逼迫自己动笔。同时作业会发布到公共区域,完成度好的评为优先,由此倒逼质量,不断迭代完善。


    学习笔记

    产品视角

    1. 三类视角

      1. 用户视角。体验、表面的理解

      2. 产品视角。设计逻辑

      3. 商业视角。利益,规模化复制的可能性

    2. 体验三要素,什么样的用户,在什么情况下用产品或功能,解决了用户什么的问题

      1. 目标用户

      2. 典型场景

      3. 需求痛点

    3. 暴力测试

      1. 关键功能的边界,有哪些限制?

      2. 作弊空间,钻空子的复杂度?

      3. 特别玩法

    4. 体验竞品

      1. 直接竞品,业务与用户both重合

      2. 相关功能,功能模块的表现

    5. 追踪式体验

      1. 持续跟进

      2. 关注中长期的运营结果,通过数据反看结果

    6. 关注点

      1. 用户场景:问题是与场景对应,什么场景解决了什么问题?

      2. 产品的亮点:功能上的特殊点,是技术还是运营的优势?

      3. 未来的判断:产品、技术还是运营优先?

      4. 内容的产生:产生的来源?

      5. 产品运转的逻辑:拉新、留存、促活的转换过程是什么?哪个是重点?

      6. 优先级:优先级排序?哪个是关键考量点?

      7. 长短线:长线还是短线产品?

      8. 产品节奏:产品生命周期与产品、运营节奏是否适配?


    用户需求

    1.  用户反馈

    2. 关注点:

      1. 产品自身问题

      2. 竞品问题

      3. 可能的机会点

    3. 渠道

      1. 公开渠道:应用市场app,UCG

      2. 半公开:社交平台,群组圈子,用户评价

      3. 内部渠道:用户投诉、电话录音、客服咨询

    4. 不同渠道的关注点

      1. 应用商店

        1. 低分差评

        2. 有效评论:有效描述

        3. 异常行为:水军、恶意

        4. 竞品变化:应用变化

      2. 微博、贴吧、知乎、雪球

        1. 有针对性的平台

        2. 关键字

        3. 歌者判断诚意

      3. 用户咨询、投诉

        1. 必须要有客服系统,或反馈入口

        2. 保留电话录音

      4. 用户点评

        1. 在行-匿名评价功能,only内部可看到,区别于公共前台评价

    5. 用户调研(明确背景和目的->选择目标用户->分析用户和问题->准备调研内容->现场调研->总结报告)

      1. 背景和目的

        1. 什么情形发起,是否有必要?

        2. 得到的结果,是为了得到什么明确的判断、结论?

        3. 话题不要太大,假大空、大而全都没有价值

      2. 选择目标用户

        1. 典型用户:通过简单的用户画像

        2. 目标用户:时间、地点、配合程度(拆解)

        3. 邀约:直接说明目的,可能发生的情况

        4. 数量: 5-10,对比更鲜明、有棱角

      3. 猜测用户的问题,设定题目

        1. 用户的可能问题:通过使用行为表现,拆解

        2. 可能的解决方案:提前列出来,抛出来,看其反馈程度

        3. 访问提纲:聚焦、开放

        4. 题目数量:线上10-20道,线下5-10道

      4. 调研、访谈

        1. 了解使用过程:观察用户行为,复原操作过程

        2. 提问:关键行为、预设问题

        3. 反馈:反馈用户有效信息,深究(我们也意识到这个问题了,那你觉得怎么解决能更舒服,因为具体的场景回答更加真实)

      5. 总结

        1. 单个用户:情况

        2. 整体:过程及计划

        3. 行动计划

    6. 误区

      1. 为了调研而调研,应带着目的、过程方案、分析方法

      2. 直接问有什么需求,笼统的问题;not原因类问题,而是行为类、操作类问题

      3. 试图说服用户,中立不带情感,说服意味着挑战,逼迫对方思考、建立防御机制

      4. 求全求量,看似安全但没有结果,选取有代表的用户

      5. 依赖调查问卷,得到的东西都是你能想象到的内容

    7. 梳理需求四要素(用户->场景->问题->解决方案)

      1. 用户:功能,不是想怎么实现,而是谁会使用;用户分类,目的是更有代表性的列出场景和问题,用户是问题的载体

      2. 场景:穷举什么情况需要使用,针对每一类用户分解

      3. 问题:相应用户&场景下,碰到的问题;问题必定是存在于特定场景下,出发人的反应,产生需求/痛点

      4. 方案:用户目前的解决方法是什么

    8. 需求优先级

      1. 商业价值=重要性+紧迫性

      2. 需求类型

        1. 基本型

        2. 期望型(重要不紧迫)

        3. 兴奋型(紧迫不重要)

      3. 未上线前

        1. 每个用户对重要性的定义不同,且随着时间动态变化

        2. 产品、运营不分家,确保基本型满足的前提下,也许考虑用户的期望型和兴奋型(亮点、卖点)

      4. 上线-免费模式

        1. 不同终端需求不一样

        2. 运营数据支撑

        3. 基本,911bug

        4. 期望&兴奋,重要型==功能使用用户率*功能使用次数率*类别重要性(50%,25%)

      5. 上线-收费模式

        1. 重要性==经济收益

      6. 前置后置条件

        1. 前置优先


    功能&流程

    1. 已有功能优化

      1. 不要期望用新功能来解决老的功能问题

      2. 优化强调效果的对比,数据指标支撑

    2. 完整功能点设计

      1. 功能目的。for用户、平台、商业

      2. 功能基本逻辑

      3. 调研相关产品功能

        1. 调研的目的

        2. 竞品如此选择原因

        3. 用户、场景、需求是否被满足

        4. 底层逻辑

        5. 产品流程

        6. 关键功能点对比,背后的原因,高频&独特功能点

        7. 产品亮点和结论

      4. 功能方案

      5. 方案细化

        1. 流程细化、异常情况处理

        2. 考核指标,上线考核依据

      6. 原型设计和文档

        1. 业务流程->页面流程

        2. 真实场景、文案

      7. 运营推广方案

    3. 业务流程

      1. 核心是抄流程,界面是为流程服务

      2. 关键出表达清楚逻辑,勿纠结于形式

      3. 双横线,并行流程N选一

      4. 主流程回流,单次操作,不考虑多次操作

      5. 判断处回流,判断后给予提示,即截止。混淆用户实际操作与流程逻辑

      6. 中括号,通过提示来终止流程

      7. 复杂流程拆分,主要功能和次要功能分开

      8. 减少流程中的用户操作


    原型

    1. 页面流程

      1. 完全站在用户视角,目的是发现体验的问题,检验流程的合理性、复杂跳转

      2. 突出页面重点元素与逻辑关系

      3. 需求->功能->逻辑->流程->原型

      4. 步骤

        1. 业务流程,明确主线,对应关键页面

        2. 页面中的核心元素

          1. 重点要体现和表达的内容

          2. 异常流程的处理逻辑

          3. 辅助的帮助页面

          4. 上下游触发点

        3. 沟通与优化

          1. 先穷举列出全部页面,再做减法

    2. 原型

      1. 手绘->低保真->高保真->UI设计

      2. 先研究流程,业务流程->页面流程;再确定页面布局、大框架

      3. 画原型,元素可以漏、模块不能漏,确定交互细节

      4. 避免一上来的就画原型。需求清楚了吗?流程清楚了吗?可以手绘吗?boss看过了吗?规划好再动手,开始慢,后面快

      5. 真实比例、字号、文案、业务、场景,模拟极端情况借助示例

      6. 需求主体,不节外生枝。新增的功能,考虑后端数据来源

      7. 不要上颜色,黑白灰即可

      8. 目录树清晰

      9. 原型全部工作应<20%以内工作量


    功能点&产品调研

    1. 功能点调研

      1. 竞品新功能驱动

        1. 核心问题。用户是谁?关键参与者;用户为什么使用?满足了什么需求;分别是怎么使用

        2. 数据表现,不用多精确,辅助信息

        3. 对于自家产品

          1. 要不要抄

          2. 能不能抄

          3. 结论,action

      2. 自家产品功能点优化驱动

        1. 你的目标用户是什么?功能点是否是用户需要的

        2. 产品功能的现状是什么?基准判定

        3. 调研的目标产品选取

        4. 功能的关键点是什么?功能逻辑是什么?

        5. 差异点是什么?相同点->关键点,异常点->亮点

    2. 产品调研

      1. 用户、场景、需求是如何被满足的

      2. 产品逻辑

        1. 用户流程,核心业务逻辑

        2. 数据流向

        3. 汇合点,用户、数据在哪个关键页面汇合

      3. 关键页面和交互

      4. 迭代路径

      5. 产品表现

        1. 数据,尽量使用产品自身的数据,二三手数据,没有关联,无法用于证明

        2. 用户表现,点评

      6. 运营路径和方法

      7. 结论,必须有,即使大概率是错的

    3. 误区

      1. 杂,做的太多;简单直白,for下结论,满足目的

      2. 非要提改进意见。Instead 多提参考意见

      3. 大而全,没卵用


    需求文档

    1. 步骤

      1. 项目背景和需求分析

        1. 需求来源,背后的原因,什么场景下遇到了什么问题

        2. 分析过程,决策过程和依据是什么,高优先级的原因

        3. 背景数据指标

        4. 解决方案

      2. 本次需求目的和功能列表

        1. 整体需求概述,阶段划分

        2. 当前处于哪一阶段,前后逻辑关系

        3. 本次需求的功能清单,列表形式;前后关系,抄分至各功能模块和相应页面

        4. 涉及的功能模块和页面

      3. 流程和所处产品模块的关系

        1. 业务逻辑图,功能点

        2. 业务流程图,正常、异常情形

        3. 页面流程图,用户视角使用情形

      4. 功能详细介绍

        1. 原型图

          1. 按照模块或流程前后顺序划分页面

          2. 左图,右文字(操作+内容)

          3. 穷举状态和异常逻辑。什么时候需要校验和判断、边界逻辑、如何处理

        2. 交互设计图

      5. 测试用例

        1. 核心用户群的走向,即关键用例

        2. 重点关注点

        3. 错误提示

      6. 考核指标和计算方法

        1. 指标

        2. 计算方法

        3. 埋点

    2. 注意事项

      1. 标题,功能/需求-版本号-需求人-创建日期

      2. 修改记录,版本号、修改人、时间、内容概述

      3. 目录树


    作业

    三节课产品经理P1作业 https://blog.csdn.net/kyle_1111/article/details/100554677

    • 拼多多APP,产品视角观察报告

    • 闲鱼APP,基于用户反馈需求分析报告

    • 淘宝APP和每日优鲜APP,购物城功能点对比分析报告

    • 达目标APP,登录注册流程还原

    • 小猿搜题APP,拍照、搜题、错题相关功能页面流程和原型还原

    • CHAO APP,产品调研报告

    • 漫游鲸小程序,写书评功能需求文档

    展开全文
  • 解读《高效休息

    千次阅读 2019-06-24 22:02:45
    转自econe认视界本文阅读时间:10分钟送给那些经常充满疲惫的朋友今天聊聊用正念冥想的方法实现高效休息。这篇文章标题“解读”二字可能不太好,因为就是把书里的实用方法拿出...
  • 这里写自定义目录标题梯度下降算法详解新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • 二 赢在产品定义 赢在用户体验 四 赢在项目管理 五 赢在测试 六 赢在量化 七 赢在发布 八 胜在团队 九 胜在技术 十 胜在沟通 1 当不是必须要开会时,学会用邮件替代效率低下的会议 2 当不得不开会时,...
  • 编写无溢出除的汇编子程序

    万次阅读 多人点赞 2013-12-21 00:15:11
    看到这个标题,你可能会问汇编中不是有div指令来实现除运算吗?为什么我们还要自己写一个子程序来实现除?为了说明我们为什么需要自己写一个实现除的子程序,还得从除为什么会发生溢出说起。 在汇编中,...
  • WORD 毕设页眉页码目录标题 排版

    千次阅读 2018-03-01 12:09:26
    1、实现效果: 2、START 准备几个标题(1,2,3级标题都有)和正文。 ①文章标题正文实现: ③目录能够根据文章标题更改...2、现在编辑页码 ,选择第页的页码,去掉 链接到前一条页眉 3、实现第X页,共Y页效果 3、...
  • 吸引别人进来看的,第一直观就是你的标题标题怎么取?这很关键,你得考虑到 SEO、爬虫、还有要点重点是否都结合在里面,如果标题取得不够好,读者估计连点都不会点击进来。 比如你解决了一个问题
  • AI科技评论发现了一个GitHub项目,上面展示了GPT-3的多种玩,整整50种,包括用GPT-3生成网页、图表、代码、文本以及推理。其中令人吃惊的是,GPT-3能生成Keras编写的卷积神经网络的代码,还能应对程序员面试、回复...
  • 但在2008年,随着原先支持HD DVD的华纳公司宣布脱离HD DVD,以及美国数家连锁卖场决定支持蓝光产品,东芝公司终于在2008年2月19日正式宣布将终止HD DVD事业,这场持续了数年的规格之争,最终以蓝光的胜利而告终。...
  • ​本篇文章以笔者负责过的一款硬件产品为例,解构硬件产品PRD文档写作...BRD对应产品之道(方向目标),MRD对应产品(路径流程),PRD对应产品之器(物理实施)。 PRD文档的目的 BRD的目的是决定为什...
  • 跑得快玩代码图

    千次阅读 2018-09-17 23:36:04
    跑得快玩代码 湖南跑得快只有一副牌,除去大怪,小怪,红桃2,*花2,方片2,黑桃A,剩下总共48张牌。个玩家每家16张。  该游戏由三人玩一副牌,最先出完的一人胜,剩下两人判负。出牌规则类似"争上游&...
  • 爬取虎扑足球论坛标题

    万次阅读 2018-11-29 09:36:38
    '[流言板]媒:勒马尔因伤落选法国队大名单,马夏尔将顶替入选', '[流言板]索尔斯克亚:弗格森告诉C罗他可以不考虑防守', '[流言板]博格巴因药检错过曼联飞机,后与球迷同机返英', '[流言板]穆帅:对尤文的比赛...
  • 视频插帧算法之光流

    千次阅读 2021-01-31 00:12:02
    视频插帧算法之光流视频插帧算法光流稀疏光流演示稠密光流演示如何补帧合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一漂亮的代码片生成一个适合你的列表创建一个表格设定...
  • 《网络安全》内容以及解读

    千次阅读 2018-12-09 00:29:14
    上传一篇我自己分析解读的《网络安全》需要记住的几条,并附上《网络安全》详细条款内容。 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑...
  • 自从沃尔特·波克博士发明了康奈尔笔记以来,这一笔记被广泛应用于听课、阅读、复习和记忆材料。 使用这一笔记可以让你的笔记系统化,使你主动融入到知识的创造中去,提高你的学习力,从而帮助你取得学习...
  • 四种超实用的超级记忆-数字定桩,借助语句定桩标题定桩,记忆宫殿 1. 数字定桩 菲常记忆数字生命密码表 对于数字记忆,记忆电话号码及车牌号,可以通过以下3点着手: ...
  • 产品读书《文案训练手册》

    千次阅读 2019-01-31 10:24:05
    他创办多家公司,用文案为武器销售产品,成功的用直邮、型录、专题广告片、电视广告、家庭购物频道等方式让自己的公司大获盈利,他是王左中右的前辈,杜蕾斯用他的写作模板,诚品书店也供奉他的神像。 美国女权活动...
  • 符号笔记 一个好的记笔记方法能让你记笔记的速度大幅增加,也会让你的笔记更加清晰,明了,更容易吃透一本著作,从而从旧知识启发自己,创造出新的东西来。 我总结归纳了一套笔记符号,可用来快速标记书中的重点...
  • 产品读书《流量池》

    千次阅读 2019-02-24 10:35:53
    方式产品设计的社交化 用瓶盖打电话(投瓶盖打电话) 校园瓶盖活动 奥利奥音乐盒活动 第五章 如何玩好裂变营销 裂变的个成功因素 裂变的个成功因素 种子用户的选择 活跃度高...
  • 产品读书《终结拖延症》

    千次阅读 2019-06-05 09:56:02
    于是强迫自己关闭微信,开始强迫自己写论文,编个标题,想个开头,一句一句写写改改,慢慢的也就进入状态写出一部分内容来了。 写完以后你会对自己会非常有信心,会觉得“太棒了!这次终于不会再临时抱佛脚了!”...
  • 对于中点画线和八分画圆的描述,一如《数据结构》使用了伪代码,而且这门课在本科里面基本上是不会有必修课地位的,同时,计算机图形学里面的代码实现并不像写个控制台程序写写就完事,起码,我觉得一个win32...
  • 英语词根词缀记忆

    万次阅读 多人点赞 2017-02-06 11:32:55
    英语词根词缀记忆(全集)  前言  英语单词的构词规律也是有规可寻的。单词是由词素构成的,词素派生出词义。单词的数量虽然浩瀚,但构成其的词素的数量却是有限的。如果掌握了词素,懂得基本的构词...
  • 位移指令实现乘法、除计算

    千次阅读 2020-01-12 01:00:06
    位移指令实现乘法、除计算前言乘法思路0思路1思路2功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 作者简介 刘津,现为阿里巴巴交互...是网易多款产品的设计体验负责人。2014年加入阿里。李月,网易移动中心交互设计师,设计艺术学硕士。曾在淘宝UED工作,目前供职于网易。先后参与网易彩票、网易新闻客户端等产...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,851
精华内容 15,540
关键字:

产品标题三段法