说话间,一年一度的中秋节又来到了跟前儿。除了品尝月饼,中秋节最重要的活动大约就是赏月了。一轮高悬月,万念俱清新。古往今来,多少文人墨客借月抒发胸臆,留下了无数吟咏明月的诗词歌赋。现如今,写诗成了贾浅浅们的专享,普通人更喜欢在中秋月圆之夜拍月亮发微博或微信朋友圈与亲朋好友互祝平安。

用手机拍月亮,大概每个人都尝试过吧?效果肯定是令人失望的。当初华为P30 Pro手机号称自带“月亮拍摄模式”,最终也被认为“拍出了不存在的细节,月亮是P上去的”。倘若使用相机拍摄的话,需要配备至少200mm以上的长焦镜头,比如尼康的COOLPIX-P1000相机,拥有3000mm的长焦镜头。除了专业的装备之外,还得选择合适的地点、合适的时机,另外还需要一点点运气。

不过,对于程序员来说,想要拍出大片的感觉根本需要这么麻烦,甚至,连手机或者相机都不需要。不信?请跟我来一起体验一下吧。

这是一张全月地貌图,古今中外的人们看到的月亮都是这样的,每个摄影师拍到的月亮也是如此。请下载并保存为moon.jpg,后面的代码会用到它。

如果已经安装了wxgl模块的话(没有的话,请先使用pip install wxgl安装),只用4行就可以把全月地貌图变成了一个三维的月球,可以旋转缩放的那种。uvsphere函数使用经纬度网格生成球,其第1个参数为月球的球心坐标,第2个参数为月球的半径(此处为1),刚才保存的图片成了纹理参数。

import wxgl
import wxgl.glplot as gltglt.uvsphere((0,0,0), 1, texture=wxgl.Texture('images/moon.jpg'))
glt.show()


细心的同学会发现,这个月球有问题:初始位置不是月球的正面。没关系,uvsphere函数可以通过ur和vr两个关键字参数设置纹理坐标。下面的代码将水平纹理坐标从默认的(0,1)改为(-0.25,0.75),月球就可以正面朝向我们了。

import wxgl
import wxgl.glplot as glttexture_moon = wxgl.Texture('images/moon.jpg')glt.uvsphere((0,0,0), 1, texture=texture_moon, ur=(-0.25,0.75))
glt.show()


上面的月球默认阳关是从画面的右前方照射过来的,通过重新设置灯光,可以让阳关从正面照射月球。请注意,wxgl坐标系的x轴指向屏幕右方,y轴指向屏幕上方,z轴指向屏幕里面。

import wxgl
import wxgl.glplot as glttexture_moon = wxgl.Texture('images/moon.jpg')
light_sun = wxgl.SunLight(direction=(0,0,-1))glt.uvsphere((0,0,0), 1, texture=texture_moon, ur=(-0.25,0.75), light=light_sun)
glt.show()


现在的月球看起来差不多了。接下来,需要为它找一个合适的背景,就以下面这张夜景图片为例吧,请将其下载并命名为bg_1.jpg,后面的代码会用到它。


下面这段代码使用quad函数将背景图片放在了月球的后面,看起来像是三维的,但拖拽旋转的话,很容易露出马脚,因此代码中限制了高度角和方位角。如果使用天空盒技术的话,效果会好一些,但对背景图片要求太高,不容易找到合适的图片。

import wxgl
import wxgl.glplot as glt
from PIL import Imagefile_bg = 'images/bg_1.jpg'
file_moon = 'images/moon.jpg'k = 8 # 背景图片高度与月球半径之比,值约大,月球看起来越小
x, y = 6, 4 # 月球在背景中的位置坐标,中心为背景坐标原点w, h = Image.open(file_bg).size # 获取背景图片宽和高
d = k * w/h # 背景图片宽度
vs = [[-d,k,-1.5], [-d,-k,-1.5], [d,-k,-1.5], [d,k,-1.5]] #  # 背景图片位置light_base = wxgl.BaseLight()
light_sun = wxgl.SunLight(direction=(0,0,-1))texture_moon = wxgl.Texture(file_moon)
texture_bg = wxgl.Texture(file_bg, yflip=True)
texcoord_bg = ((0,1), (0,0), (1,0), (1,1)) glt.figure(zoom=0.6, elev_range=(0,0), azim_range=(-10,10))
glt.quad(vs, texture=texture_bg, texcoord=texcoord_bg, light=light_base)
glt.uvsphere((x,y,0), 1, texture=texture_moon, ur=(-0.25,0.75), light=light_sun)
glt.show()

改变代码中k值,可以调整月球的大小;改变x和y,可以调整月球在图中的位置。效果如下图所示。


读懂了这段代码,就可以随意“拍摄”月亮了:想在哪儿拍就在哪儿拍,想拍多大就拍多大。


增加一个模型几何变换函数,还可以让月亮缓缓地升高转动。

import wxgl
import wxgl.glplot as glt
from PIL import Imagefile_bg = 'images/bg_2.jpg'
file_moon = 'images/moon.jpg'k = 10 # 背景图片高度与月球半径之比,值约大,月球看起来越小
x, y = -7, 0 # 月球在背景中的位置坐标,中心为背景坐标原点w, h = Image.open(file_bg).size # 获取背景图片宽和高
d = k * w/h # 背景图片宽度
vs = [[-d,k,-1.5], [-d,-k,-1.5], [d,-k,-1.5], [d,k,-1.5]] #  # 背景图片位置def tf(t):"""月球移动函数"""global x, yt %= 10000dx, dy = t/1000, t/3000x += dxy += dyreturn ((dx, dy, 0), )light_base = wxgl.BaseLight()
light_sun = wxgl.SunLight(direction=(0,0,-1))texture_moon = wxgl.Texture(file_moon)
texture_bg = wxgl.Texture(file_bg, yflip=True)
texcoord_bg = ((0,1), (0,0), (1,0), (1,1)) glt.figure(zoom=0.6, elev_range=(0,0), azim_range=(-10,10))
glt.quad(vs, texture=texture_bg, texcoord=texcoord_bg, light=light_base)
glt.uvsphere((x,y,0), 1, texture=texture_moon, ur=(-0.25,0.75), light=light_sun, transform=tf)
glt.show()

由于CSDN限定上传图片文件大小不能超过5M,gif只能做成这样了。

掌握了以上要点,这个中秋节就可以在微博和朋友圈随意秀出月亮大片了。

中秋节的月亮怎么拍?不用手机和相机,程序员照样能拍出大片的感觉相关推荐

  1. 【Python】中秋节快到了,这才是程序员该赏的“月亮”(3D+音频+源码)

    目录 导语​ 一.做月饼 二.赏"月" 1. 引言 2. 下载ursina库 3.实现思路 4.资源的获取 总结 导语 送一个圆圆的饼,寄一个圆圆的请,献一颗圆圆的心,圆一个圆圆的 ...

  2. OSChina 周六乱弹 ——手机进化史?程序员用啥手机?

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @温家成 :分享陈奕迅的单曲<阿牛> <阿牛>- ...

  3. 小米手机,相机程序调试,点击拍照无法启动相机或者无法保存图片

    用小米手机相机调试 android程序,发现一个诡异的问题,同样的代码在其他程序命名情况下 例如:情况1:AndroidManifest.xml的package="com.android.c ...

  4. 推荐几个好的手机应用,程序员用(黑科技)

    1.AIDE aide是一个编写Java和安卓等的一个手机软件 功能很强大 上面的为java编写,可以实现简单的java,小白可以玩,功能还是可以滴 不过还是建议eclipse 这个是编写androi ...

  5. 134个治病小偏方,从此不用去医院 - 健康程序员,至尚生活!

    1.艾叶熏蒸治偏头痛 将端午节采集回来的艾叶一把,放在锅内烧开,煮20分钟后端下,趁热用布蒙住头进行熏蒸.水凉了之后再放上火上烧,每次熏两遍,每天熏两次,一个星期后可痊愈. 2. 按摩牙龈消红肿 先将 ...

  6. 程序员选手机那些事儿

    程序员选手机那些事儿 程序员购买手机其实一直都是一件非常为难其的一件事情,特别是开发 APP 的程序员选手机就更是头疼了.其实我个人觉得程序员选手机也是有些程序员不是人系列的感觉,很多认为程序员就必须 ...

  7. 雷军:小米二为何不用1300万像素相机_TechWeb

    雷军:小米二为何不用1300万像素相机_TechWeb 雷军:小米二为何不用1300万像素相机 http://www.techweb.com.cn 2012.8.20 14:14 TechWeb.co ...

  8. ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》

    崩坏3.战双,虽然是手机游戏,作为一个PC党,我还是热衷于用电脑玩游戏. 用电脑玩游戏可以把画质全部开到最大,依旧可以顺畅地进行游戏. 手机就不行,即使是苹果,把画质拉满,依旧会有卡顿. 特别是崩坏3 ...

  9. android 设置录像帧率,华为手机设置相机录像帧率的方法

    华为手机是身边很多朋友都在使用的一款智能手机,该手机给用户提供了很多实用的功能,使用起来非常方便.在生活中,有很多朋友都会使用手机录像.而这款手机给用户提供了高清摄像头,而且自带了相机功能,因此可以帮 ...

最新文章

  1. qiankun 微前端_基于qiankun落地部署微前端爬”坑“记
  2. kmeans聚类源代码
  3. bitter matlab,两分钟英语自我介绍模板
  4. bd3.2 Python高级
  5. 80. Leetcode 1642. 可以到达的最远建筑 (堆-技巧三-事后小诸葛)
  6. 【STM32】FreeRTOS创建和删除任务示例(动态方法)
  7. map的extract 是更换 map 的键而不重分配的唯一方式:
  8. java不同垃圾回收器_细述 Java垃圾回收机制→Types of Java Garbage Collectors
  9. 论文浅尝 - EMNLP2020 | 基于规则引导的协作 agent 知识图谱推理学习
  10. floating输入 高阻输入_STM32 GPIO八种输入输出模式
  11. 我们大学的第一桶金!!(更新中。。。)
  12. html超链接图标图片,HTML-标签:图片 超链接
  13. 亚马逊美国站店铺fbm自发货流程是什么?亚马逊美国站店铺fbm如何做起来?
  14. 何钦铭.c语言程序设计,《C语言程序设计》 - 何钦铭
  15. Android 10.0 TV板 强制app横屏显示
  16. CSS实现文字动画效果
  17. db2经典SQL语句大全
  18. java--案例:[Random]随机100-200的数、班级点名器、控制台输入三个数,输出最大值,或最小值?
  19. 【无标题】【3D建模制作技巧分享】zbrush中如何卡硬边?
  20. Lambda与Stream流

热门文章

  1. 在spring.io网下下载的快速入门项目,导进去pom.xml文件爆红,报:Non-resolvable parent POM for com.tc:demo:0.0.1-SNAPSHOT: F
  2. nuxt使用element ui设置成英文
  3. F5负载均衡器通过iRules实现http应用的灵活转发
  4. 如何查看.net core 最新版本的功能
  5. 触控面板 开发_长信科技研发内核不断升级 成触控显示一体化领军企业
  6. C语言class 1:初识与准备
  7. svg 使用path实现圆角效果
  8. 字节跳动/今日头条校招大礼包 2019年校招大礼包
  9. React 问题总结
  10. yocto 学习:1- 什么是yocto