raytracerNOGLFWtest.py
You can view and download this file on Github: raytracerNOGLFWtest.py
1# -*- coding: utf-8 -*-
2#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3# This is an EXUDYN example
4#
5# Details: Create scissor-like chain of bodies and prismatic joints to test functionality
6#
7# Author: Johannes Gerstmayr
8# Date: 2020-01-14
9#
10# Copyright:This file is part of Exudyn. Exudyn is free software. You can redistribute it and/or modify it under the terms of the Exudyn license. See 'LICENSE.txt' for more details.
11#
12#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13
14import exudyn as exu
15#a local run must not open a plot window when windows are suppressed (#2477)
16if exu.special.userInterface.suppressPlots: import matplotlib; matplotlib.use('Agg')
17from exudyn.utilities import * #includes itemInterface and rigidBodyUtilities
18from math import sin, cos
19import exudyn.graphics as graphics
20
21testIsActive = exu.sys.get('testIsActive', False)
22testIsActive = True
23import numpy as np
24
25SC = exu.SystemContainer()
26mbs = SC.AddSystem()
27
28gBack = graphics.CheckerBoard(point=[0,0,0], size=10, nTiles=10, normal=[0.,0.,1],
29 color=[0.9,0.9,0.9]+[graphics.material.indexChrome],
30 alternatingColor=[0.8,0.8,0.8]+[graphics.material.indexChrome],
31 addEdges=False)
32
33text = '''
34 !"#$%&'()*+,-./
350123456789:;<=>?
36@ABCDEFGHIJKLMNO
37PQRSTUVWXYZ[\\]^_
38`abcdefghijklmno
39pqrstuvwxyz{|}~
40ΓΔΘΛΞΠΣΦΨΩαβγδεζ
41ηθικλμνξοπρστυφχ
42ψωϕϵ₀₁₂₃₄₅₆₇₈₉⁰¹
43²³⁴⁵⁶⁷⁸⁹∂∫♥√≈∞🙂😒
44ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ
45ÐÑÒÓÔÕÖרÙÚÛÜÝÞß
46àáâãäåæçèéêëìíîï
47ðñòóôõö÷øùúûüýþÿ'''
48
49gText = graphics.Text(point=[0,-5,1], text=text, color=[0.2,0.2,0.2,1], fontSize=12)
50
51mbs.CreateGround(referencePosition=[0,0,-1], graphicsDataList=[gBack]+[gText]*(1-(not testIsActive)) )
52
53gObjectsList = []
54
55nMaterials = 10
56nTiles = 16*2
57
58for i in range(nMaterials//2):
59 i0 = i*2
60 i1 = i*2+1
61 color0 = graphics.colorList[i0]
62 color1 = graphics.colorList[i1]
63 gBrick = graphics.Brick(size=[0.8,1.25,0.7],
64 color=color0[:3]+[graphics.material.indexDefault+i0],
65 addEdges=True,addNormals=True,
66 )
67
68 gSphere = graphics.Sphere(radius=0.8,
69 color=color1[:3]+[graphics.material.indexDefault+i1],
70 nTiles=nTiles)
71
72 gSphere = graphics.Move(gSphere, [0,0,0], np.diag([1.2,0.8,0.8]) )
73
74 gObjectsList.append( mbs.CreateGround(referencePosition=[0,0,0],
75 graphicsDataList=[gBrick]) )
76 gObjectsList.append( mbs.CreateGround(referencePosition=[0,0,0],
77 graphicsDataList=[gSphere]) )
78
79#just to simulate something
80mbs.CreateRigidBody(referencePosition=[3,0.8,1],
81 inertia=InertiaCuboid(1000, [2,1.2,1]),
82 show=False)
83
84mbs.Assemble()
85
86import matplotlib.pyplot as plt
87
88mbs.variables['imageCounter'] = 0
89#rotation matrix for view CTRL-7:
90A=RotationVector2RotationMatrix(52/180*pi*np.array([-0.82,0.25,0.5149]))
91
92def PreStepUserFunction(mbs, t):
93 if t > 0:
94 rot = RotationMatrix2RotationVector(A@RotationMatrixZ(0.5*t*0.5*pi))
95 SC.renderer.SetModelView(5.7,rot,[0,0,0])
96 if not testIsActive:
97 image = SC.renderer.RedrawAndGetImage(True)
98 imageCounter = mbs.variables['imageCounter']
99 exu.Print(f'image: frame{imageCounter:05}.png:',image.shape)
100 plt.imsave(f"images/frame{imageCounter:05}.png", image)
101 mbs.variables['imageCounter'] += 1
102
103 fact = t if t < 1 else 1
104 #fact = 1
105 for i, obj in enumerate(gObjectsList):
106 offset = 0.2*t*0.5*pi
107 radius = 4*fact
108 phi = offset + i/nMaterials * 2 * pi
109 pos = [radius*sin(phi),radius*cos(phi),1.25]
110 mbs.SetObjectParameter(obj, 'referencePosition', pos)
111 rot = RotXYZ2RotationMatrix([5*phi, 2*phi,0])
112 mbs.SetObjectParameter(obj, 'referenceRotation', rot)
113 return True
114
115mbs.SetPreStepUserFunction(PreStepUserFunction)
116
117#sizeFactor=1, nTiles=128, lightVariations=71, multisampling=1:
118#OLD: approx 0.7s / image
119windowSize = [1200,1000]
120if testIsActive:
121 windowSize = [400,300] #3
122
123SC.visualizationSettings.view0.window.renderWindowSize = windowSize
124
125SC.visualizationSettings.general.useMultiThreadedRendering = False
126#SC.visualizationSettings.view0.window.showComputationInfo = False
127SC.visualizationSettings.nodes.showNumbers = True
128SC.visualizationSettings.nodes.show = True
129# SC.visualizationSettings.general.textAlwaysInFront = False
130
131
132SC.visualizationSettings.openGL.multiSampling = 2
133SC.visualizationSettings.openGL.light1.enable = False
134SC.visualizationSettings.openGL.light0.position = [0,0,15,1]
135SC.visualizationSettings.openGL.light1.position = [-3,-3,-10,1]
136SC.visualizationSettings.openGL.light1.diffuse = SC.visualizationSettings.openGL.light0.diffuse
137#SC.visualizationSettings.openGL.light1.specular = SC.visualizationSettings.openGL.light0.specular
138SC.visualizationSettings.openGL.light0.shadow = 0.2
139SC.visualizationSettings.raytracer.numberOfThreads = 8+32*(not testIsActive)
140SC.visualizationSettings.openGL.light0.lightRadius = 0.5
141SC.visualizationSettings.raytracer.lightRadiusVariations = 13
142SC.visualizationSettings.raytracer.advanced.shadowSmoothingSteps = 2
143SC.visualizationSettings.raytracer.advanced.shadowScalingFactor = 3
144SC.visualizationSettings.raytracer.verbose = (not testIsActive)+1
145SC.visualizationSettings.raytracer.maxReflectionDepth = 2
146SC.visualizationSettings.raytracer.maxTransparencyDepth = 2
147#SC.visualizationSettings.view0.camera.useRaytracer = True
148SC.visualizationSettings.raytracer.imageSizeFactor = 1
149SC.visualizationSettings.raytracer.keepWindowActive = True
150SC.visualizationSettings.view0.camera.clippingPlaneNormal = [0,1*0,0]
151SC.visualizationSettings.view0.camera.clippingPlaneDistance = 2.
152SC.visualizationSettings.view0.camera.perspective = 1
153
154SC.visualizationSettings.view0.scene.drawCoordinateSystem = 2
155SC.visualizationSettings.general.useGradientBackground = True
156
157
158m = SC.renderer.materials.Get("chrome")
159m.reflectivity = 0.12
160SC.renderer.materials.Set("chrome", m)
161
162if False:
163 import matplotlib.pyplot as plt
164 exu.Print('get image...')
165 SC.renderer.SetState({'displayScaling':1.5})
166 SC.renderer.SetModelView(9,[0,0,1],[1,0,0])
167 image = SC.renderer.RedrawAndGetImage(True)
168 exu.Print('image:',image.shape)
169 plt.imshow(image)
170 plt.show(block=True)
171
172
173tEnd = 4
174stepSize = 2e-2
175simulationSettings = exu.SimulationSettings()
176simulationSettings.solution.file.write = False
177#simulationSettings.timeIntegration.realtime.active = True
178#simulationSettings.timeIntegration.realtime.factor = 0.2
179simulationSettings.timeIntegration.numberOfSteps = int(tEnd/stepSize)
180simulationSettings.timeIntegration.endTime = tEnd
181
182if not testIsActive:
183 SC.renderer.Start() #start graphics visualization
184 SC.renderer.SetModelView(5.7,52/180*pi*np.array([-0.82,0.25,0.5149]),[0,0,0])
185
186mbs.SolveDynamic(simulationSettings)
187
188if not testIsActive:
189 SC.renderer.DoIdleTasks()
190 SC.renderer.Stop()
191
192if testIsActive:
193 #this example shows how to retrieve a single image:
194 import matplotlib.pyplot as plt
195
196 exu.Print('get image...')
197 #rotation matrix for view CTRL-7:
198 SC.renderer.SetState({'displayScaling':1.5})
199 SC.renderer.SetModelView(5.7,52/180*pi*np.array([-0.82,0.25,0.5149]),[0,0,0])
200 image = SC.renderer.RedrawAndGetImage(True)[0:int(windowSize[1]*0.9),:,:] #cut out version info!
201 if False: #save image for manual check
202 exu.Print('image:',image.shape, ', save as images/test.jpg')
203 plt.imsave("images/test.jpg", image)
204 plt.imshow(image)
205 plt.show(block=False)
206
207 #compute checksum for image:
208 flat_pixels = image.ravel().astype(np.int64)
209 n = flat_pixels.size
210 counters = np.arange(n, 2*n, dtype=np.int64) #start at n, so pixels are weighted different, but similar
211 checksum = np.sum(flat_pixels * counters)/np.int64(1e14)
212 exu.Print('raytracerNOGLFWtest: image checksum=', checksum)
213
214 exu.sys['testResult'] = checksum