This is a problem I am stuck on, but it is easy to solve.
Problem
I was finding the shade node “Shader to RGB” that converts the output color of a shade into RGB. However I couldn’t find it in Blender 8.3.
Solution
“Shader to RGB” node is prepared for “EEVEE” renderer only. So we need to change the Render Engine into “EEVEE” and we can find “Shader to RGB” in Add > Converter.
This is a trouble shooting for using bpy.ops.constraint.childof_set_inverse.
Trouble
When I tried to set “Set Inverse” for “Child Of” constraint in bone and executed bpy.ops.constraint.childof_set_inverse(constraint=”Child Of”, owner=’BONE’) on Blender, the following error occurred. How can we solve it?
>>> bpy.ops.constraint.childof_set_inverse(constraint="Child Of", owner='BONE')
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
File "C:\Program Files\Blender Foundation\Blender 2.83\2.83\scripts\modules\bpy\ops.py", line 201, in __call__
ret = op_call(self.idname_py(), None, kw)
RuntimeError: Operator bpy.ops.constraint.childof_set_inverse.poll() Context missing 'constraint'
Environment
Windows 10 Blender 2.83
Solution
To execute this operation, we should pass the context that contains target constraint and activate the target bone in pose mode.
import bpy
bone_name = "foot.IK.L"
bpy.ops.object.mode_set(mode='POSE', toggle=False)
pose_bone = bpy.context.active_object.pose.bones[bone_name]
# set the target constraint to the context
context_py = bpy.context.copy()
context_py["constraint"] = pose_bone.constraints["Child Of"]
# activate target bone
bpy.context.active_object.data.bones.active = pose_bone.bone
bpy.ops.constraint.childof_set_inverse(context_py, constraint="Child Of", owner='BONE')
This is the log to setup Minecraft server and client to play “Witchcraft and Wizardry” map for multiplayer.
Though there is a detailed documents, I summarized my way to setup the server for beginners. Please note that we will not be liable for any damages caused by use of this add-on and scripts.
The environment
Minecraft Java Edition version 1.16.3 (Select Minecraft Java Edition 1.16 – 1.16.5) CentOS Linux release 7.8.2003 (Core) java version 1.8.0_332
I used rental VPS from ConoHa. You can use other rental servers , too.
Method
Prepare the server
Download server.jar
Generate Minecraft vanilla data with server.jar
Put “Witchcraft and Wizardry” files into Minecraft directory
Change server settings
Run
Prepare the client
Download resource.zip of “Witchcraft and Wizardry”
Change the resource pack
Access the server
1. Prepare the server
1.1 Download server.jar
If you have the vanilla server and the vanilla data, the default world data for Minecraft, on the server, you can skip section 1 and 2. Go to the step 3 Put “Witchcraft and Wizardry” files into minecraft directory!
There are 2 way to download, “download files on the local PC and upload” or “download files on the server directly.”
Download server.jar on the local PC and upload it
Download the server from mcversions.net. Select the version of your Minecraft and click the button “Download Server jar.” Be careful to select the correct version for your Minecraft!!
Then access the server with WinSCP. Generate “minecraft_server” directory and put the server.jar into the minecraft_server. Rename server.jar into minecraft_server.jar.
Download server.jar on the server directly with command
Access the server with Teraterm and download server.jar directly using “wget” command on the server. Be careful to select the correct version for your Minecraft!!
mkdir ~/opt/
cd opt
mkdir minecraft_server # create directory where you'd like to setup server
cd minecraft_server
# this is the server for 1.16.3, check the link url on mcversions.net
wget https://launcher.mojang.com/v1/objects/f02f4473dbf152c23d7d484952121db0b36698cb/server.jar
mv server.jar minecraft_server.jar
1.2 Generate Minecraft vanilla data with server.jar
Run minecraft_server.jar
Then run the minecraft_server.jar, and the vanilla world, default world, is generated in “minecraft_server” directory. Remove all items in world directory.
java -Xmx1G -Xms1G -jar minecraft_server.jar nogui
stop # after generating minecraft data
If you are using Forge or fabric, put them on the minecraft_server directory instead of minecraft_server.jar. Be careful to select the correct version for your Minecraft!!
1.3 Put “Witchcraft and Wizardry” files into Minecraft directory
There are 2 way to setup, “download files on the local PC and upload” or “download files on the server directly.”
Download “Witchcraft and Wizardry” on the local PC and upload it
Access the Floo Network page and download the map. I selected “Light version”.
Extract the downloaded zip. Remove files in “world” directory on minecraft_server. Then copy all files in the extracted directory “Witchcraft and Wizardry – Light” into the “world.”
Download “Witchcraft and Wizardry” on the server directly with command
Access the server with Teraterm and download server.jar directly using “wget” command.
mkdir ~/download_wichcraft
cd ~/download_wichcraft
wget http://download2391.mediafire.com/sqwru7rill4g/xke143473zi4ytp/Witchcraft+and+Wizardry+-+Light.zip
unzip Witchcraft+and+Wizardry+-+Light.zip -d Witchcraft_and_Wizardry
rm -r ~/opt/minecraft_server/world/
mkdir ~/opt/minecraft_server/world/ # remove all items from minecraft_server/world/
cp -r Witchcraft_and_Wizardry/* ~/opt/minecraft_server/world/ # copy all items into minecraft_server/world/
When trying to call “glutInit()” of PyOpenGL, I got the error “NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling”.
# python source code
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
glutInit()
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
Error Detail
---------------------------------------------------------------------------
NullFunctionError Traceback (most recent call last)
/tmp/ipykernel_14/3289264930.py in <module>
3 from OpenGL.GLU import *
4
----> 5 glutInit()
6 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
7
/usr/local/lib/python3.9/site-packages/OpenGL/GLUT/special.py in glutInit(*args)
331 try:
332 # XXX need to check for error condition here...
--> 333 _base_glutInit( ctypes.byref(count), holder )
334 finally:
335 os.chdir( currentDirectory )
/usr/local/lib/python3.9/site-packages/OpenGL/platform/baseplatform.py in __call__(self, *args, **named)
421 pass
422 else:
--> 423 raise error.NullFunctionError(
424 """Attempt to call an undefined function %s, check for bool(%s) before calling"""%(
425 self.__name__, self.__name__,
NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling
The documentation says “Win32 and Win64 binary installers for PyOpenGL include a copy of GLUT”. So uninstall current pyopengl first. And download binary installer for windows. Put the downloaded file in some directory, then run the command “pip install <file name>” in the directory where the file is saved.
Put freeglut\bin\x64\freeglut.dll into C:\Windows\System32.
Add “C:\Windows\System32” to environment variable “PATH” to enable python find the library.
If the error still occurred, check if your library name is in Win32Platform.GLUT() <python>\Lib\site-packages\OpenGL\platform\win32.py
@baseplatform.lazy_property
def GLUT( self ):
for possible in ('freeglut%s.%s'%(size,vc,), 'freeglut', 'glut%s.%s'%(size,vc,)): # Added 'freeglut' because the library name is freeglut.dll
# Prefer FreeGLUT if the user has installed it, fallback to the included
# GLUT if it is installed
try:
return ctypesloader.loadLibrary(
ctypes.windll, possible, mode = ctypes.RTLD_GLOBAL
)
except WindowsError:
pass
return None
In unfolded UV, the correspondence between the point of UV map and the vertex of 3D object is not one-to-one. Thus we use ‘Mesh Loop’ instead of vertex or edge to distinct point of UV map.
Mesh Loop is an element surrounding a face, which consists of edges and vertices. Each quad face consists of 4 Mesh Loops as below. For example, cube objects have 6face, 24 mesh loops.
import bpy
obj = bpy.data.objects[obj_name]
mesh_loops = obj.data.loops
for mesh_loop in mesh_loops:
print(mesh_loop)
Mesh UV Loop
UVs have Mesh UV Loops as a counterpart to the Mesh Loops. And the correspondence between Mesh Loop and MeshUVLoop is one-to-one.
Today’s goal is to construct development environment for data analytics and machine learning with Anaconda.
What is Anaconda?
Anaconda is open source Python distribution for data science. You can see the list of package lists here.
the open-source Individual Edition (Distribution) is the easiest way to perform Python/R data science and machine learning on a single machine. Developed for solo practitioners, it is the toolkit that equips you to work with thousands of open-source packages and libraries.
Access the websiteanaconda.com/products/individual and click “Download” button to download the installer of the edition that you want.
Start the installer and click “Continue”.
Check if anaconda is completely installed with terminal.
Start Anaconda Navigator
Start applications > Anaconda-Navigator.
Create virtual environment
Click Environments and create new environment.
I named new environment “data_analysis”.
Install libraries or modules with conda
Conda is an open source package management system and environment management system.
Open terminal in the environment where you want to install libraries.
Then put the “conda install” command to install libraries. For example, I installed pytorch in the “pytorch” environment. The option “-c” is the channel (What is a “conda channel”?).
conda install pytorch torchvision -c pytorch
Start Application
Select environment what you want to use and install or launch application.
I launched “Jupyter notebook” and check that “pythorch” library is installed successfully.
Today’s goal is to understand a layer of process “convolution” in neural network. In other words, this article describes convolutional neural network (CNN or ConvNet) that is a neural network contains convolutional layers in its architecture.
What Convolution Is
Convolution is the binary operation to takes 2 functions and produces a function \(f * g\), which is defined as the integral of the product of the two functions after one is reversed and shifted.
$$(f*g)(t) = \int f(\tau)g(t – \tau)d\tau $$
Examples of 2 function
In the context of image processing, convolution is the process of generating output image by weighting input image with the filter. For example, convolution is used in smoothing with gaussian filter.
Example of convolution by Gaussian filter
The image of weights is called “kernel” in convolution. And the output is the compression of input.
In CNN, the convolution layer is used to generate output image that represents feature of input image while compressing local region. 1 layer can have several kernels and the output is the same number of feature maps as kernels.
In convolution layer, the input image will be converted. For example, a 5*5 kernel is applied to RGB 32*32 image to generate 28*28 output as below.
Note that there are 2 styles of convolution for RGB image. The first one is the way in which 3 maps generated from RGB channels by convolution are added together to 1 channel output image. In the second way, each channel is converted to each channel of output image. In the latter case the output image has 3 channels.
The former is commonly used in CNN.
If the convolution layer has 5 different kernels, the output has 5 channels.
Parameters
Parameters that determines convolution process.
channel
kernel size
stride
padding
dilation
Channel and kernel size
channel = input channel * the number of kernel. The channel of output is the same as the channel of kernel.
Kernel size is the size of kernel side.
Stride
Stride is the size that filter sliding to input image.
Padding
Padding is the amount of padding space applied on both sides of input. Padding changes output size to fit input image size.
Dilation
Dilation controls the spacing between the kernel points.
Convolution In PyTorch
PytTorch provides a method torch.nn.Conv2d() for 2D convolution. Conv2d makes a convolutional layer in network class that extends nn.Module as below.
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 6, 3) #1channel input, 6channel output (6kernels), 3*3 kernel
self.conv2 = nn.Conv2d(6, 16, 3) #6channel input, 16channel output, 3*3 kernel
self.fc1 = nn.Linear(16 * 6 * 6, 120) #Linear transform from 16*6*6 features into 84 features
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = F.relu(self.conv1(x))
x = F.max_pool2d(x, (2, 2))
x = F.relu(self.conv2(x))
x = F.max_pool2d(x, 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:]
num_features = 1
for s in size:
num_features *= s
return num_flat_features
net = Net()