基於WPF的3D Sphere實現模式,升級實現了該3D導覽Demo。先pose一張demo效果圖
所有頂點的坐標來源於足球的頂點。足球整個球面完全由正五邊形和正六邊形拼成,每條拼縫的長度一致,故知道球體半徑后即可設法求出60個頂點的坐標。
具體求法屬於數學的立體幾何范疇,反正求解時廢了我蠻多精力的,完全是工匠精神支撐我求解完成,具體就不做詳述了,可參考以下圖:
來源:http://blog.sina.cn/dpool/blog/s/blog_49966d1d0100tc0d.html
得到所有定點坐標后,即可創建Viewport3D控件,並在坐標位置創建相應的ModelVisual3D對象。
我計算得到的60個點3維坐標:
private List<Point3D> GetBuckyBallPoints() { List<Point3D> ltPoints = new List<Point3D>(); ltPoints.Add(new Point3D(.850651, 0, 2.327438)); ltPoints.Add(new Point3D(.262866, .809017, 2.327438)); ltPoints.Add(new Point3D(-.688191, .5, 2.327438)); ltPoints.Add(new Point3D(-.688191, -.5, 2.327438)); ltPoints.Add(new Point3D(.262866, -.809017, 2.327438)); ltPoints.Add(new Point3D(1.701301, 0, 1.801708)); ltPoints.Add(new Point3D(.52573, 1.618035, 1.801708)); ltPoints.Add(new Point3D(.52573, -1.618035, 1.801708)); ltPoints.Add(new Point3D(-1.376383, -.999999, 1.801708)); ltPoints.Add(new Point3D(-1.376383, .999999, 1.801708)); ltPoints.Add(new Point3D(1.964166, .809017, 1.275977)); ltPoints.Add(new Point3D(1.376381, 1.618035, 1.275977)); ltPoints.Add(new Point3D(-.162461, 2.118035, 1.275977)); ltPoints.Add(new Point3D(-1.113517, 1.809017, 1.275977)); ltPoints.Add(new Point3D(-2.064574, .5, 1.275977)); ltPoints.Add(new Point3D(-2.064574, -.5, 1.275977)); ltPoints.Add(new Point3D(-1.113517, -1.809017, 1.275977)); ltPoints.Add(new Point3D(-.162461, -2.118035, 1.275977)); ltPoints.Add(new Point3D(1.376381, -1.618035, 1.275977)); ltPoints.Add(new Point3D(1.964166, -.809017, 1.275977)); ltPoints.Add(new Point3D(2.389492, .5, .425326)); ltPoints.Add(new Point3D(1.213921, 2.118035, .425326)); ltPoints.Add(new Point3D(.262865, 2.427051, .425326)); ltPoints.Add(new Point3D(-1.639248, 1.809017, .425326)); ltPoints.Add(new Point3D(-2.227033, .999999, .425326)); ltPoints.Add(new Point3D(-2.227033, -.999999, .425326)); ltPoints.Add(new Point3D(-1.639248, -1.809017, .425326)); ltPoints.Add(new Point3D(.262865, -2.427051, .425326)); ltPoints.Add(new Point3D(1.213921, -2.118035, .425326)); ltPoints.Add(new Point3D(2.389492, -.5, .425326)); ltPoints.Add(new Point3D(2.227033, .999999, -.425326)); ltPoints.Add(new Point3D(1.639248, 1.809017, -.425326)); ltPoints.Add(new Point3D(-.262865, 2.427051, -.425326)); ltPoints.Add(new Point3D(-1.213921, 2.118035, -.425326)); ltPoints.Add(new Point3D(-2.389492, .5, -.425326)); ltPoints.Add(new Point3D(-2.389492, -.5, -.425326)); ltPoints.Add(new Point3D(-1.213921, -2.118035, -.425326)); ltPoints.Add(new Point3D(-.262865, -2.427051, -.425326)); ltPoints.Add(new Point3D(1.639248, -1.809017, -.425326)); ltPoints.Add(new Point3D(2.227033, -.999999, -.425326)); ltPoints.Add(new Point3D(2.064574, .5, -1.275977)); ltPoints.Add(new Point3D(1.113517, 1.809017, -1.275977)); ltPoints.Add(new Point3D(.162461, 2.118035, -1.275977)); ltPoints.Add(new Point3D(-1.376381, 1.618035, -1.275977)); ltPoints.Add(new Point3D(-1.964166, .809017, -1.275977)); ltPoints.Add(new Point3D(-1.964166, -.809017, -1.275977)); ltPoints.Add(new Point3D(-1.376381, -1.618035, -1.275977)); ltPoints.Add(new Point3D(.162461, -2.118035, -1.275977)); ltPoints.Add(new Point3D(1.113517, -1.809017, -1.275977)); ltPoints.Add(new Point3D(2.064574, -.5, -1.275977)); ltPoints.Add(new Point3D(1.376383, .999999, -1.801708)); ltPoints.Add(new Point3D(-.52573, 1.618035, -1.801708)); ltPoints.Add(new Point3D(-1.701301, 0, -1.801708)); ltPoints.Add(new Point3D(-.52573, -1.618035, -1.801708)); ltPoints.Add(new Point3D(1.376383, -.999999, -1.801708)); ltPoints.Add(new Point3D(.688191, .5, -2.327438)); ltPoints.Add(new Point3D(-.262866, .809017, -2.327438)); ltPoints.Add(new Point3D(-.850651, 0, -2.327438)); ltPoints.Add(new Point3D(-.262866, -.809017, -2.327438)); ltPoints.Add(new Point3D(.688191, -.5, -2.327438)); return ltPoints; }
實現的效果圖
工具:Visual Studio 2017
工程:WPF C#
源碼下載: