Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python id()函数生成随机颜色_Python_Python 2.7_Colors - Fatal编程技术网

使用python id()函数生成随机颜色

使用python id()函数生成随机颜色,python,python-2.7,colors,Python,Python 2.7,Colors,场景: 作为3D游戏引擎的一部分,我想实现像素完美的“鼠标拾取”(基本上允许用户单击场景中的不同3D模型)。实现这一点的一种方法是将场景渲染为纹理,其中每个对象都随机使用单一的平面颜色着色。然后,当用户单击屏幕时,我只需获得光标下方的颜色,就可以知道我在场景中单击了哪个对象。当然,我希望确保每个模型都为其指定了唯一的颜色。颜色本身并不太重要,因为它永远不会呈现在屏幕上 实际问题: 因为我有一个Model类,所以当我在python中创建不同的模型对象时,我知道每个对象在python中都有不同的id

场景: 作为3D游戏引擎的一部分,我想实现像素完美的“鼠标拾取”(基本上允许用户单击场景中的不同3D模型)。实现这一点的一种方法是将场景渲染为纹理,其中每个对象都随机使用单一的平面颜色着色。然后,当用户单击屏幕时,我只需获得光标下方的颜色,就可以知道我在场景中单击了哪个对象。当然,我希望确保每个模型都为其指定了唯一的颜色。颜色本身并不太重要,因为它永远不会呈现在屏幕上

实际问题: 因为我有一个
Model
类,所以当我在python中创建不同的模型对象时,我知道每个对象在python中都有不同的
id()
值。给定这个唯一的内存地址值,有没有办法生成唯一的RGB浮点颜色三元组


编辑: 按照@Jack Witherell的回答,下面是一些实现该想法的代码:

def get_pick_color(model):
    model_id = id(model)
    r = int(model_id/(256**3))
    g = int(model_id%(256**3)/(256**2))
    b = int(model_id%(256**2)/256)
    a = int(model_id%256)
    return (r, g, b, a)

for model in range(10):
    print model, id(model), get_pick_color(model)
样本输出:

0 50096352 (2, 252, 104, 224)
1 50096328 (2, 252, 104, 200)
2 50096304 (2, 252, 104, 176)
3 50096280 (2, 252, 104, 152)
4 50096256 (2, 252, 104, 128)
5 50096232 (2, 252, 104, 104)
6 50096208 (2, 252, 104, 80)
7 50096184 (2, 252, 104, 56)
8 50096160 (2, 252, 104, 32)
9 50096136 (2, 252, 104, 8)

这取决于id格式的值类型。如果知道该值只是一个整数,可以尝试将颜色值的r设置为id()%256,g设置为id()/256。这将适应大约65536个不同对象ID的不同值

例如,如果有1103个对象,单击1098,r将等于74,g将等于4,因为:

1098%256等于74 (1098-256-256-256-256=74)

四舍五入后,1098/256=4


如果适用,可以将其扩展到另外两个颜色值,蓝色和alpha。每个像素的颜色值看起来有点像这样

(id()/16777216,(id()%16777216)/65536,(id()%65536)/256,id()%2‌​(56)

假设id()输出数字54421704,则颜色值将相等

(3,62104200)


这应该是号码54421704所独有的

谢谢您的回答!通常,内置的
id()
函数返回的数字稍大一些。刚才用Python2.7在IDLE中测试时,我创建了一个变量,并返回了一个id为
54421704L
(作为随机示例)。使用你的方法,我会得到一个200的红色分量和一个212584的绿色分量。果岭可能有点太高,无法使用;理想情况下,我希望将其保持在256以下,就像红色的一样,并将结果正常化。另外,我也想使用蓝色通道。有没有一种方法可以使用它来进一步增加受支持的模型对象的数量?哦,当然!容易地如果使用蓝色并使其存储id()为65536,则每次超过65536的倍数时,它将增加1。这将为您提供16777216种可能性。如果然后存储第四个值,并使用id()设置它%16777216(您需要能够在纹理中绘制alpha之类的内容),那么您将获得16777216*256的可能性。确保将最大值除以第二个指数的值设置为等于该指数。(在我的原始示例中,256是指数,b存储的值小于id()/[指数256]每个像素的颜色值看起来有点像这样
(id()/16777216,(id()%16777216)/65536,(id()%65536)/256,id()%256)
假设id()输出数字
54421704
,颜色值将相等(362104200)这应该是54421704Perfect所独有的!我添加了一个示例来实现您对我的问题的回答。这是一个非常好的解决方案,特别是当您使用指数时:)。用你评论中的信息更新你的答案,我会接受它!