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