SharpDX的Camera实现

<Introduction to 3D Game Programming with Direct3D 11.0>第15章Camera类的C#(SharpDX)实现。

using System;
using SharpDX;

namespace SharpDX_Study_001
{
    class Camera
    {
        public Camera()
        {
            mPosition = Vector3.Zero;
            mRight = Vector3.UnitX;
            mUp = Vector3.UnitY;
            mLook = Vector3.UnitZ;
            SetLens(0.2f * SharpDX.MathUtil.Pi, 1.0f, 1.0f, 1000.0f);
        }
        public Vector4 PositionXM
        {
            get
            {
                return new Vector4(mPosition, 0);
            }
        }
        public Vector3 Position
        {
            get
            {
                return mPosition;
            }
            set
            {
                mPosition = value;
            }
        }
        public Vector4 RightXM
        {
            get
            {
                return new Vector4(mRight, 0);
            }
        }
        public Vector4 UpXM
        {
            get
            {
                return new Vector4(mUp, 0);
            }
        }
        public Vector4 LookXM
        {
            get
            {
                return new Vector4(mLook, 0);
            }
        }
        public Vector3 Right
        {
            get
            {
                return mRight;
            }
        }
        public Vector3 Look
        {
            get
            {
                return mLook;
            }
        }
        public Vector3 Up
        {
            get
            {
                return mUp;
            }
        }
        public float NearZ
        {
            get
            {
                return mNearZ;
            }
        }
        public float FarZ
        {
            get
            {
                return mFarZ;
            }
        }
        public float Aspect
        {
            get
            {
                return mAspect;
            }
        }
        public float FovY
        {
            get
            {
                return mFovY;
            }
        }
        public float FovX
        {
            get
            {
                float halfWidth = 0.5f * NearWindowWidth;
                return 2.0f * Convert.ToSingle(Math.Atan(halfWidth / mNearZ));
            }
        }
        public float NearWindowWidth
        {
            get
            {
                return mAspect * mNearWindowHeight;
            }
        }
        public float NearWindowHeight
        {
            get
            {
                return mNearWindowHeight;
            }
        }
        public float FarWindowWidth
        {
            get
            {
                return mAspect * mFarWindowHeight;
            }
        }
        public float FarWindowHeight
        {
            get
            {
                return mFarWindowHeight;
            }
        }

        /// <summary>
        /// Set frustum.
        /// </summary>
        /// <param name="fovY"></param>
        /// <param name="aspect"></param>
        /// <param name="zn"></param>
        /// <param name="zf"></param>
        public void SetLens(float fovY, float aspect, float zn, float zf)
        {
            // cache properties
            mFovY = fovY;
            mAspect = aspect;
            mNearZ = zn;
            mFarZ = zf;

            mNearWindowHeight = 2.0f * mNearZ * Convert.ToSingle(Math.Tan(0.5f * mFovY));
            mFarWindowHeight = 2.0f * mFarZ * Convert.ToSingle(Math.Tan(0.5f * mFovY));

            mProj = Matrix.PerspectiveFovLH(mFovY, mAspect, mNearZ, mFarZ);
        }

        //       // Define camera space via LookAt parameters.
        public void LookAt(Vector4 pos, Vector4 target, Vector4 worldUp)
        {
            Vector3 L = new Vector3(pos.X, pos.Y, pos.Z);
            Vector3 T = new Vector3(target.X, target.Y, target.Z);
            Vector3 U = new Vector3(worldUp.X, worldUp.Y, worldUp.Z);
            LookAt(L, T, U);
        }
        public void LookAt(Vector3 pos, Vector3 target, Vector3 up)
        {
            mPosition = pos;
            mLook = Vector3.Normalize(target - pos);
            mRight = Vector3.Normalize(Vector3.Cross(up, mLook));
            mUp = Vector3.Cross(mLook, mRight);
        }
        public Matrix View
        {
            get
            {
                return mView;
            }
        }
        public Matrix Proj
        {
            get
            {
                return mProj;
            }
        }
        public Matrix ViewProj
        {
            get
            {
                return View * Proj;
            }
        }
        // Strafe/Walk the camera a distance d.
        public void Strafe(float d)
        {
            // mPosition += d*mRight
            Vector4 s = new Vector4(d);

            var nPos = (s * RightXM + PositionXM);
            mPosition = new Vector3(nPos.X, nPos.Y, nPos.Z);
        }
        public void Walk(float d)
        {
            // mPosition += d*mLook
            Vector4 s = new Vector4(d);
            var nPos = (s * LookXM + PositionXM);
            mPosition = new Vector3(nPos.X, nPos.Y, nPos.Z);
        }

        // Rotate the camera.
        public void Pitch(float angle)
        {
            // Rotate up and look vector about the right vector.

            Matrix R = Matrix.RotationAxis(mRight, angle);
            mUp = Vector3.TransformNormal(mUp, R);
            mLook = Vector3.TransformNormal(mLook, R);
        }
        public void RotateY(float angle)
        {
            // Rotate the basis vectors about the world y-axis.

            Matrix R = Matrix.RotationY(angle);
            mRight = Vector3.TransformNormal(mRight, R);
            mUp = Vector3.TransformNormal(mUp, R);
            mLook = Vector3.TransformNormal(mLook, R);
        }

        // After modifying camera position/orientation, call to rebuild the view matrix.
        public void UpdateViewMatrix()
        {
            var R = mRight;
            var U = mUp;
            var L = mLook;
            var P = mPosition;

            // Keep camera's axes orthogonal to each other and of unit length.
            L = Vector3.Normalize(L);
            U = Vector3.Normalize(Vector3.Cross(mLook, mRight));

            // U, L already ortho-normal, so no need to normalize cross product.
            R = Vector3.Cross(U, L);

            // Fill in the view matrix entries.
            float x = -Vector3.Dot(P, R);
            float y = -Vector3.Dot(P, U);
            float z = -Vector3.Dot(P, L);

            mRight = R;
            mUp = U;
            mLook = L;

            mView.Column1 = new Vector4(mRight, x);
            mView.Column2 = new Vector4(mUp, y);
            mView.Column3 = new Vector4(mLook, z);
            mView.Column4 = Vector4.UnitW;
        }


        private Vector3 mPosition;

        private Vector3 mRight;

        private Vector3 mUp;

        private Vector3 mLook;


        // Cache frustum properties.
        float mNearZ;
        float mFarZ;
        float mAspect;
        float mFovY;
        float mNearWindowHeight;
        float mFarWindowHeight;

        Matrix mView;
        Matrix mProj;

    }
}

 

管理者不需要懂业务?

我觉得问题分成两个比较好,招聘一个管理者是否需要他有相关的背景或者业务知识;一个称职的管理者是否需要精通业务。

第一个问题是否定的,虽然相关的行业,相同的职能,是肯定极大的加分项,但是没有相关的背景也不应该是否定项。毕竟作为管理者,更多的还是考虑到软技能和个人能力,而不是背景。当然想找救火队员的不算。

第二个问题,我觉得是肯定的,作为管理者,必须要做决策,也要为决策的失误承担责任,如果不能了解具体的业务,只是凭经验去判断,风险是极大的。但是也出现了很多基本不懂业务,也极成功的例子,我觉得问题在于,即使本人不懂,也需要一个非常懂业务的参谋,然后得到他的信任,然后相信他的建议,作出合适的决策。

今年的目标

今年立了不少计划,已经过去7个月了,总得来说完成得还好。

今年的天气很异常,虽然天气是个借口,但是的确影响了我的跑步计划,8月开始北京的天气已经有凉爽的感觉了,适当地恢复性跑起来。

其他的事情除了学德语,都还算顺利,驾照拿完后没少练车,虽然是自动档,不过现在已经算是比较熟练了,2个月开了4000多公里。

所以到12月底还有5个月,更新计划如下:

1.驾照已经考完,尽可能多开,能开车后活动半径大了很多,基本上150公里以内的地方都可以当天往返,对其他活动帮助极大。

2.带徒弟,新人还算是期望值以内,能打个7.5分吧,年底前按部就班的培训就好了。

3.跑步,适当地恢复起来,10月前恢复到每月15次以上,70公里,8月份争取30公里吧。

4.读书,经济类的书读了几本,短期也够用了,现在这个状态读这些书帮助也不大了,新买了本罗伯特议事规则,还有本个人形象的书,年底前读完。

5.学德语,这个前半年完全没开始,这是下半年的重点,年底前争取达到A1水平。

部门人员流失的原因

大半夜上来更新。

丈母娘急性肠胃炎,天热加上乱吃东西,老婆去陪床,我是跑腿兼司机,刚刚回到家洗完澡,2小时前还困成狗,现在已经没有睡意了。

当然,真正的狗在旁边啃骨头,咔咔响。

最近一年,部门内人员流失非常严重,部门老大辞职,基层经理走了一个,被老板改造职位一个,没实权的我一个,被新经理扁平组织结构整没了一个,只有一个稳定了。

基层的工程师更是大换血,入职2-4年的几乎全部走光,还有几个正在培养或者已经培养成专家的技术骨干离职。

管理层依然无动于衷。

管理层肯定不傻,那么这是为啥啊!

我也不是牢骚,猜猜吧。

首先应该是部门老大的更换,管理层应该把这种动荡视作领导更换的正常现象?

其次是部门职能的变化,最开始是个纯的技术部门,最近随着行业内所有的设备厂家都把利润点从新机销售转移到售后服务(耗材),盈利成了部门最重要的KPI。

当然这两点不会对基层的工程师有过多的影响,但是会影响的部门的策略。

然后就是管理层和部门老大对于团队认识的偏差,部门关键成员的定义理论上正确,但是只着眼于如何保证组织架构的完整,以及团队能力的再建设。问题在于即使组织架构完整,即使可以100%的再建设一个技术能力相同甚至更好的团队,所花的时间,以及建设团队过程中的各种问题,都会极大地影响部门,比如士气。

想让我吐槽的是,Key Person的定义首先从来没有更新,然后居然还有人数限制,这和文化大革命时一刀切右派有什么不同了……

时至今日,我依然看不出管理层有丝毫想改变的意图,不出意外的话,再过一年,现在的团队会逐渐成熟,成为一个比较完备的团队,就如2013~2014年的情况相同,还有2008~2009年,然后恐怕又是一次大的动荡。

一次失败的软件工程实践

昨天晚上加班到11点。
说是加班,其实也只是坐在那慢慢地等。
展会上和另外一家公司合作,华中科技几个博士出来创业开的公司,之前听同事的评价说是学究气蛮重的公司。所以没怎么放在心上,两边的接口也只是几个IO口,不到10条socket命令。
在前期程序都写好的情况下,生生在展会现场调了半天的BUG,完全是设计时逻辑没有组织好,10来个步骤,修了一个环节另外一个环节出问题,对象藕
合太高了吧。
这家在业务上算是个软件公司了,但是这业务水平只能是业余,要是做过单元测试,应该不会出这种问题吧。
问题应该出在基层员工的水平,公司流程(技术规范),以及领导对类似问题的重视程度。
我觉得这种问题目前在国内挺常见的,除了一些各行业内的标杆企业,其他企业都有一种凑乎的心态。

5月跑步总结

最后一周又掉链子了,本月目标依然没有完成,最后结果是16次53.5公里,目标的20次又没有完成。

其实前三周还是比较稳定的,最后一周在家请假考驾照,反而懒了,不过身体状态保持得还好,体重没有太大的变化,但是腰围已经明显减小,上周买裤子买的是Slim,工作后还是第一次。

月底的2次强度减少,下个月开始适当加点量,酌情冲刺两次5公里。

最后,Nike Plus还是不用了,换国产的APP吧,试试咕咚。

Target Review

年初的计划两周前的更新,昨天(5月25日)终于把驾照的事情搞定了,用了半年,终于把第一项完成了。

昨天早上7点出门,晚上4点多到家,基本和上班的时间差不多,但是实际的时间只有上午路考的10分钟,和下午理论考试的10分钟,还有最后拿证的2分钟,其他时间都在等待,等待叫号,等待上机。感觉生生地把20分钟的时间拖成了一天。让我这种习惯了快节奏的人体验到了另一种的疲劳。

然后就是学德语了,既然驾照完事了,后面就是开始学德语了,参照跑步,每周抽五个小时学德语应该不是问题,从这周末开始计时吧。

其他几项虽然有些小出入,但是还在误差允许范围之内,下个月再review吧。

修身养性

刚才一个朋友好意劝我,结果我直接吼了起来。最近脾气真的不太好。

饭否9年,统计了一下关键字,我里面一半以上都是和工作有关,什么公司、客户、领导、航站楼、工作,就没点自己的事情。

但是9年这种公私不分,全力工作的结果是什么呢?

当你在错误的方向上,越努力,就走得越偏,我并不后悔当初选择了走技术路线,技术岗位。但是如果我还在这条死路上坚持,我就有问题了。

年初的时候给自己订了个目标,现在Review然后更新一下吧。

当初的三个目标:

1.拿下驾照,还差科目三,下下周(5月23日)好像没有会了,请假去考试。

2.学德语,这个还没有开始,书之前都已经买好了,先看看基本单词和基本语法。

3.带徒弟,新人已经入职,还不知道到底如何,培训计划已经列好,就看看接受程度了。

4.跑步,3月开始跑步,现在2个半月,昨天第一次跑了5公里,目前的计划是5月20次60公里,照现在的进度肯定可以完成。估计月底可以跑70公里左右。这样下个月的计划就是本月完成的公里数,然后提升配速。第一个5公里超出了我的计划,修正一下中期目标就是每次都能跑5公里以上。

5.读经济类教材,已经读了《财务会计》,《微观经济学》,正在读《公司理财》,这本量有点大,估计只能跳着读一些,争取6月底之前先结束,然后读《投资学》。

 

四月跑步纪录

三月跑了15次,中间有很多次是因为犯懒,三月底的时候连续跑了很多天,于是觉得自己可以坚持,就订了个25次,60公里的目标。

前半月还算正常,月底的时候去天津出差了两次,住在家里反而影响了运动,没有沐浴,而且睡沙发床相当不舒服。

最后的成绩是17次,45公里。

考虑到出差这种倒霉的工作性质,一个月20次应该对我比较实际些吧。

单次的跑步量比3月有所上升,但是依旧很少,还没有体力能跑到4公里以上,速度大约为8分钟每公里,依旧非常渣。。。渣到我都不好意思分享到朋友圈里。

下个月争取平均3公里吧,20次60公里。

跑步小记

3月初决定开始跑步,平均一周三次,一次2公里左右。有反复,有连续三四天不跑步,也有连续三四天跑。
中间败了不少装备,主要是一双KAYANO 1300,蓝牙耳机300,其他衣服袜子都是小数,加一块2000块吧,最近在计划买个跑步机,准备等到污染实在有影响,或者自己的运动量能达到每周30公里的吧。
身体上的变化不大,运动量还是太小,虽然也有感觉更健康了,但是应该是心理作用,而且也和大腿的肌肉酸痛抵消了。
但是心理上的影响更大,一直觉得自己没有毅力,好久没有完成过自己订的目标了。这次算是勉强完成,让自己多了不少信心。
跑步应该是那种每天投入一些成本,长期稳定获得回报的运动,如果按照投资的角度来看,绝对是回报率超高,但是理性有时战胜不了感性。虽然还远远达不到跑步爱好者的平均强度,但是我有些可以理解跑步爱好者的优越感以及自发推广跑步运动的心情了。
“你们这些战斗力只有5的渣渣,能坚持做点什么不?”
下一阶段的目标,逐渐提升运动量,争取每周跑5次以上,这样每周有12公里的运动量。时间订一个月吧。
中期目标是完成5公里吧。