WxGL应用实例:绘制带有塑料质感的分子模型

本文介绍了如何利用WxGL的光照模式,特别是太阳光照模式(wxgl.SunLight),通过调整漫反射系数、镜面反射系数、高光系数和透光系数等参数,来模拟不同材质的视觉效果。代码示例展示了如何创建具有塑料质感的灰色圆球,并通过组合不同颜色的球体和圆管构建出类似分子模型的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文的重点是演示如何使用WxGL光照模式,以及如何通过设置漫反射系数、镜面反射系数、高光系数、透光系数等参数来模拟不同的材质。所谓的分子模型,只是笔者凭空想象出来的由圆球和圆管组成的类似积木的玩具,希望不会因此而造成误会。

除了点、线和2D文本,WxGL的其他实体模型默认使用户外光照(wxgl.SkyLight)模式,主光束自上而下以模拟来自天空的光线,而来自地面的反射光线相对较弱。

import wxgl

app = wxgl.App(bg='#f0f0f0', fovy=40)
app.sphere((-2,0,0), 0.35, color='#d8d8d8')
app.sphere((0,0,0), 0.35, color='#d8d8d8')
app.sphere((2,0,0), 0.35, color='#d8d8d8')
app.sphere((-1,-1,0), 0.35, color='#d8d8d8')
app.sphere((1,-1,0), 0.35, color='#d8d8d8')
app.show()

上面的代码使用默认的光照模式绘制了5个灰色的圆球,在浅灰背景下,中灰的圆球明显缺乏立体感。

在这里插入图片描述

太阳光照模式(wxgl.SunLight),也称为平行光照模式,是最常用的一种光照模式,默认平行光线从背后向前方照射。

wxgl.SunLight(direction=(0.0,0.0,-1.0), lightcolor=(1.0,1.0,1.0), ambient=(0.3,0.3,0.3), **kwds)

主要参数如下:

direction   - 太阳光方向
lightcolor  - 太阳光颜色
ambient     - 环境光颜色
kwds        - 关键字参数
    diffuse     - 漫反射系数:值域范围[0.0, 1.0],数值越大,表面越亮。默认值0.8
    specular    - 镜面反射系数:值域范围[0.0, 1.0],数值越大,高光越亮。默认值0.6
    shiny       - 高光系数:值域范围[1, 3000],数值越大,高光区域越小。默认值50
    pellucid    - 透光系数:值域范围[0.0,1.0],数值越大,背面越亮。默认值0.5

下面的代码将默认光照改为wxgl.SunLight,同时调整了漫反射系数、镜面反射系数、高光系数、透光系数的默认值,模拟出了塑料的质感。

import wxgl

light = wxgl.SunLight(direction=(0.5,-0.5,-1.0), diffuse=0.7, specular=0.98, shiny=100, pellucid=0.9)

app = wxgl.App(bg='#f0f0f0', fovy=40)
app.sphere((-2,0,0), 0.35, color='#d8d8d8', light=light)
app.sphere((0,0,0), 0.35, color='#d8d8d8', light=light)
app.sphere((2,0,0), 0.35, color='#d8d8d8', light=light)
app.sphere((-1,-1,0), 0.35, color='#d8d8d8', light=light)
app.sphere((1,-1,0), 0.35, color='#d8d8d8', light=light)
app.show()

在这里插入图片描述

再画上几个其他颜色的小球,将其中的几个圆球用圆管串起来。

import wxgl

c1, c2, c3, c4, c5 = '#d8d8d8', '#00d0d0', '#6060f0', '#903030', '#90C090'
light = wxgl.SunLight(direction=(0.5,-0.5,-1.0), diffuse=0.7, specular=0.98, shiny=100, pellucid=0.9)

app = wxgl.App(bg='#f0f0f0', azim=-30, elev=20, fovy=40)

app.sphere((-2,0,0), 0.35, color=c1, light=light)
app.sphere((0,0,0), 0.35, color=c1, light=light)
app.sphere((2,0,0), 0.35, color=c1, light=light)
app.sphere((-1,-1,0), 0.35, color=c1, light=light)
app.sphere((1,-1,0), 0.35, color=c1, light=light)

app.cylinder((-2,0,0), (-1,-1,0), 0.17, color=c2, light=light)
app.cylinder((0,0,0), (-1,-1,0), 0.17, color=c2, light=light)
app.cylinder((0,0,0), (1,-1,0), 0.17, color=c2, light=light)
app.cylinder((2,0,0), (1,-1,0), 0.17, color=c2, light=light)

app.sphere((-2,1.2,-0.6), 0.35, color=c3, light=light)
app.sphere((-3,-0.6,0.6), 0.35, color=c3, light=light)
app.sphere((2.6,0.5,1), 0.35, color=c3, light=light)
app.sphere((2.6,0.5,-1), 0.35, color=c3, light=light)
app.sphere((1,-1.5,1), 0.35, color=c5, light=light)

app.cylinder((-2,0,0), (-2,1.2,-0.6), 0.17, color=c4, light=light)
app.cylinder((-2,0,0), (-3,-0.6,0.6), 0.17, color=c2, light=light)
app.cylinder((2,0,0), (2.6,0.5,1), 0.17, color=c4, light=light)
app.cylinder((2,0,0), (2.6,0.5,-1), 0.17, color=c2, light=light)
app.cylinder((1,-1,0), (1,-1.5,1), 0.17, color=c2, light=light)

app.sphere((0,0.7,-0.8), 0.15, color=c2, light=light)
app.sphere((0,0.7,0.8), 0.15, color=c2, light=light)
app.sphere((-1,-1.7,-0.8), 0.15, color=c2, light=light)
app.sphere((-1,-1.7,0.8), 0.15, color=c2, light=light)

app.cylinder((0,0,0), (0,0.7,-0.8), 0.08, color=c2, light=light)
app.cylinder((0,0,0), (0,0.7,0.8), 0.08, color=c2, light=light)
app.cylinder((-1,-1,0), (-1,-1.7,-0.8), 0.08, color=c2, light=light)
app.cylinder((-1,-1,0), (-1,-1.7,0.8), 0.08, color=c2, light=light)

app.show()

看起来是不是像一个分子模型了呢?

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天元浪子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值